/******************************************************************************

Copyright (C), 2012-2014, HiSilicon Technologies Co., Ltd.
******************************************************************************
File Name     :
Version       : Initial draft
Author        :
Created Date   :
Last Modified by:
Description   :
Function List :
Change History:
******************************************************************************/

/*******************************************************************************
*                       Include files
*******************************************************************************/
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

#include<string.h>
#include<sys/time.h>

#include "hi_type.h"
#include "hi_debug.h"

#include "cc708.h"
#include "cc608.h"
#include "cc708_dec.h"
#include "cc708_obj.h"
#include "cc708_osd.h"
#include "cc_queue.h"

#include "hi_cc608_def.h"
#include "hi_cc708_def.h"
#include "cc_timer.h"
#include "cc_debug.h"

/*****************************************************************************
*                       Macro Definitions
*****************************************************************************/
#define CC608_FROM_CABLE    1
#define MAX_DTVCC_PACKET_LEN   128

/* CC data start flags, see A53 page 32 */
#define CABLE_DATA              0x03
#define USER_DATA_START_CODE    0x000001b2
#define ATSC_IDENTIFIER         0x47413934
#define SAUD_IDENTIFIER         0x53415544
#define USER_DATA_TYPE_CODE     0x03    /*CC*/

#define PACKET_START_FLAG       0xFF    /* DTVCC channel packet start flag */
#define PACKET_DATA_FLAG        0xFE    /* DTVCC channel packet data flag */
#define PACKET_END_FLAG1        0xFA
#define PACKET_END_FLAG2        0xFB
#define PACKET_CC608_FIELD1     0xFC
#define PACKET_CC608_FIELD2     0xFD

#define MAX_VBI_DATA_COUNT      15
#define CAPTION_BUF_SIZE 64

/*
   p is buffer pointer;
   o is offset;
   b stand for left move bit number;
*/
#define GET8(p,o)   (p[o] & 0xFF)
#define GET16(p,o)  ((p[o]<<8) | p[(o)+1])
#define GET32(p,o)  ((p[o]<<24) | (p[(o)+1]<<16) | (p[(o)+2]<<8) | p[(o)+3])

#define GET1(p,o,b) ((p[o] >> (b)) & 0x01)
#define GET2(p,o,b) ((p[o] >> (b)) & 0x03)
#define GET3(p,o,b) ((p[o] >> (b)) & 0x07)
#define GET4(p,o,b) ((p[o] >> (b)) & 0x0F)
#define GET5(p,o,b) ((p[o] >> (b)) & 0x1F)
#define GET6(p,o,b) ((p[o] >> (b)) & 0x3F)
#define GET7(p,o,b) ((p[o] >> (b)) & 0x7F)

#define INVALID_SERVICE_NUM (-1)

/*****************************************************************************
*                    Structure Definitions
*****************************************************************************/

enum
{
    COLOR_NULL,
    COLOR_BLACK,
    COLOR_WHITE,
    COLOR_RED,
    COLOR_GREEN,
    COLOR_BLUE,
    COLOR_YELLOW,
    COLOR_MAGENTA,
    COLOR_CYAN
};

typedef HI_VOID (*DTVCC_CmdDecode_FN)(HI_U8 *pu8Cmd);
typedef struct tagCC708_CmdMap_S
{
    HI_U8 u8CMDLen;
    DTVCC_CmdDecode_FN pfnCmdDecoder;
}CC708_CmdMap_S;

typedef struct tagColor_S
{
    HI_U8 r;
    HI_U8 g;
    HI_U8 b;
} Color_S;

typedef struct tagCC708_CaptionBuf_S
{
    HI_U16 u16Buf[CAPTION_BUF_SIZE];
    HI_U8  u8BufLen;
}CC708_CaptionBuf_S;

typedef struct tagNTSC_BitStream_S
{
    HI_U8     *pu8Start;
    HI_U8     *pu8Buf;
    HI_U8     *pu8End;
    HI_U8     u8LeftBits;    /* read_count number of available bits */
} NTSC_BitStream_S;

/*******************************************************************************
*                       Static Data Definition
*******************************************************************************/
static HI_VOID _DtvCC_NulCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_ETXCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_BSCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_FFCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_CRCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_HCRCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_EXT1Cmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_P16Cmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_SetCurrentWindowCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_ClearWindowsCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_DisplayWindowsCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_HideWindowsCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_ToggleWindowsCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_DeleteWindowsCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_DelayCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_ResetCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_SetPenAttributesCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_SetPenColorCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_SetPenLocationCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_SetWindowAttributesCmd(HI_U8 *pu8Cmd);
static HI_VOID _DtvCC_DefineWindowCmd(HI_U8 *pu8Cmd);

static HI_BOOL _DtvCC_OddParityCheck(HI_U8 data);
static HI_S32 _DtvCC_GetEXT1CmdLen(HI_U8 *pu8Cmd, HI_S32 avalaible_len);

CC708_CmdMap_S DTVCCCmdMap[64] =
{
    {1,_DtvCC_NulCmd},   // 0x00
    {1,NULL},
    {1,NULL},
    {1,_DtvCC_ETXCmd},   // 0x03
    {1,NULL},
    {1,NULL},
    {1,NULL},
    {1,NULL},
    {1,_DtvCC_BSCmd},    // 0x08
    {1,NULL},
    {1,NULL},
    {1,NULL},
    {1,_DtvCC_FFCmd},    // 0x0C
    {1,_DtvCC_CRCmd},    // 0x0D
    {1,_DtvCC_HCRCmd},   // 0x0E
    {1,NULL},
    {2,_DtvCC_EXT1Cmd},  // 0x10
    {2,NULL},
    {2,NULL},
    {2,NULL},
    {2,NULL},
    {2,NULL},
    {2,NULL},
    {2,NULL},
    {3,_DtvCC_P16Cmd},   // 0x18
    {3,NULL},
    {3,NULL},
    {3,NULL},
    {3,NULL},
    {3,NULL},
    {3,NULL},
    {3,NULL},
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x80
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x81
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x82
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x83
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x84
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x85
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x86
    {1,_DtvCC_SetCurrentWindowCmd},  // 0x87
    {2,_DtvCC_ClearWindowsCmd},      // 0x88
    {2,_DtvCC_DisplayWindowsCmd},    // 0x89
    {2,_DtvCC_HideWindowsCmd},       // 0x8A
    {2,_DtvCC_ToggleWindowsCmd},     // 0x8B
    {2,_DtvCC_DeleteWindowsCmd},     // 0x8C
    {2,_DtvCC_DelayCmd},             // 0x8D
    {1,NULL},                       // 0x8E
    {1,_DtvCC_ResetCmd},           // 0x8F
    {3,_DtvCC_SetPenAttributesCmd},  // 0x90
    {4,_DtvCC_SetPenColorCmd},       // 0x91
    {3,_DtvCC_SetPenLocationCmd},    // 0x92
    {1,NULL},
    {1,NULL},
    {1,NULL},
    {1,NULL},
    {5,_DtvCC_SetWindowAttributesCmd},// 0x97
    {7,_DtvCC_DefineWindowCmd},      //0x98
    {7,_DtvCC_DefineWindowCmd},      //0x99
    {7,_DtvCC_DefineWindowCmd},      //0x9A
    {7,_DtvCC_DefineWindowCmd},      //0x9B
    {7,_DtvCC_DefineWindowCmd},      //0x9C
    {7,_DtvCC_DefineWindowCmd},      //0x9D
    {7,_DtvCC_DefineWindowCmd},      //0x9E
    {7,_DtvCC_DefineWindowCmd},      //0x9F
};


static HI_U16 DTVCCG2Code2UnicodeMap[96] =
{
    0x1020,0x1021,0x005f,0x005f,0x005f,0x2026,0x005f,0x005f,0x005f,0x005f,0x0160,0x005f,0x0152,0x005f,0x005f,0x005f,
    0x2588,0x2018,0x2019,0x201c,0x201d,0x2022,0x005f,0x005f,0x005f,0x2122,0x0161,0x005f,0x0153,0x2120,0x005f,0x0178,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x215b,0x215c,0x215d,0x215e,0x2502,0x2510,0x2514,0x2500,0x2518,0x250c,
};


static HI_U16 DTVCCG3Code2UnicodeMap[96] =
{
    0xf101,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
    0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,0x005f,
};


static CC708_CaptionBuf_S stCaptionBuf;

/*******************************************************************************
*                       Static Function  Definition
*******************************************************************************/

static void _DtvCC_DelayTimerCallback(HI_U32 u32Param)
{
    HI_U8 u8ModuleId = (HI_U8)u32Param;
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(u8ModuleId);
    if (HI_NULL == pstCCObj)
    {
        return;
    }

    if(pstCCObj->u8IsDelay)
    {
        pstCCObj->u8IsDelay = 0;
    }
}
static HI_VOID _DtvCC_DelayTimerInit(HI_U8 u8ModuleID)
{
    HI_U32 u32ModuleID = (HI_U32)u8ModuleID;
    (HI_VOID)CCTimer_Open(CCTIMER_ID_708DELAY, _DtvCC_DelayTimerCallback, u32ModuleID);
}

static void _DtvCC_DelayTimerStart(HI_U8 u8ModuleID, HI_U8 u8TenthOfSecond)
{
    HI_U32 u32Msec = u8TenthOfSecond * 100;
   (HI_VOID)CCTimer_Start(CCTIMER_ID_708DELAY, u32Msec, TIMER_MODE_ONE_SHOOT);
}

static void _DtvCC_DelayTimerStop(HI_U8 u8ModuleID)
{
    (HI_VOID)CCTimer_Stop(CCTIMER_ID_708DELAY);
}

static HI_U32 _DtvCC_Translate2Color(HI_U8 u8Color)
{
    Color_S stRGB;

    HI_U32 u32Color = 0;

    static HI_U32 au8RGBMap[3][4] = {
    /*red*/        {0xff000000,0x005f0000,0x00af0000,0x00ff0000},
    /*green*/     {0xff000000,0x00005f00,0x0000af00,0x0000ff00},
    /*blue*/       {0xff000000,0x0000005f,0x000000af,0x000000ff}
    };

    stRGB.r = (u8Color & 0x30)>>4;
    stRGB.g = (u8Color & 0x0c)>>2;
    stRGB.b = u8Color & 0x03;

    u32Color=au8RGBMap[0][stRGB.r] | au8RGBMap[1][stRGB.g] | au8RGBMap[2][stRGB.b];

    return u32Color;
}

/****************************************************************************************
*                                   Coding Layer Decoder Function Definitions
*****************************************************************************************/
/************************************************************************
 * Function name: HI_S32 _DtvCC_ParseServiceBlock(HI_U8 *pbuf, HI_U8 len)
 * Description: DTV CC service decoder.
 * Arguments: pbuf: the address of the service data.
 *                   len:  the length of the service len.
 * Return value:
 * Note:
 * Todo:
 *************************************************************************/
static HI_S32 _DtvCC_ParseServiceBlock(HI_U8 *pu8Buf, HI_U8 u8BufLen)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    HI_U8 *pu8ServiceData = NULL;
    HI_U8 u8ServiceLen,u8Offset = 0;
    HI_U8 u8ServiceData;
    DTVCC_CMDBuffer_S *pstCMDBuffer = &pstCCObj->stCMDBuffer;

    if(NULL == pu8Buf || 0 == u8BufLen)
    {
        HI_ERR_CC("pu8Buf pointer NULL!\n");
        return HI_FAILURE;
    }

    u8ServiceLen = u8BufLen;
    pu8ServiceData = pu8Buf;

    if(pstCMDBuffer->u8CurSize < pstCMDBuffer->u8TotalSize)
    {
        /*follow case happened when a cmd transport in two services*/
        if((u8ServiceLen - u8Offset) >= (pstCMDBuffer->u8TotalSize - pstCMDBuffer->u8CurSize))
        {
            CC708_CmdMap_S CmdMap;
            HI_U8 u8CMD;
            HI_U8 CmdLen;
            DTVCC_CmdDecode_FN DTVCCCmdDecoder;

            memcpy(&pstCMDBuffer->au8CMD[pstCMDBuffer->u8CurSize],pu8ServiceData,pstCMDBuffer->u8TotalSize - pstCMDBuffer->u8CurSize);

            //u8CMD = pstCMDBuffer->au8CMD[0];

            u8CMD = pu8ServiceData[u8Offset];
            CmdMap = DTVCCCmdMap[((u8CMD&0x80)>>2)|(u8CMD&0x1f)];
            CmdLen = CmdMap.u8CMDLen;
            DTVCCCmdDecoder = CmdMap.pfnCmdDecoder;

            if(DTVCCCmdDecoder != NULL)
            {
                DTVCCCmdDecoder(pstCMDBuffer->au8CMD);
            }

            pstCMDBuffer->u8CurSize = 0;
            pstCMDBuffer->u8TotalSize = 0;
            memset(pstCMDBuffer->au8CMD,0,8);

            u8Offset += CmdLen;
        }
        else
        {
            memcpy(&pstCMDBuffer->au8CMD[pstCMDBuffer->u8CurSize],pu8ServiceData,u8ServiceLen - u8Offset);

            pstCMDBuffer->u8CurSize += u8ServiceLen - u8Offset;

            return HI_SUCCESS;
        }
    }
    else
    {
        memset(pstCMDBuffer->au8CMD,0,8);
        pstCMDBuffer->u8CurSize = 0;
    }

    while(u8Offset < u8ServiceLen)
    {
        u8ServiceData = GET8(pu8ServiceData,u8Offset);
        if(u8ServiceData < 0x20 || ((0x7f < u8ServiceData) && (u8ServiceData < 0xa0)))/*CMD,C0,C1*/
        {
            CC708_CmdMap_S stCmdMap;
            HI_U8 u8CmdLen = 0;
            DTVCC_CmdDecode_FN pfnDTVCCCmdDecoder;

            stCmdMap = DTVCCCmdMap[((u8ServiceData&0x80) >>2 )|(u8ServiceData & 0x1f)];
            u8CmdLen = stCmdMap.u8CMDLen;
            pfnDTVCCCmdDecoder = stCmdMap.pfnCmdDecoder;

            /*when servive data is DTVCC command or ETX(0x30),the caption data will be paint on the screen.P35 S8.6*/
            if(((0x7f < u8ServiceData) && (u8ServiceData < 0xa0)) || u8ServiceData == C0_ETX || u8ServiceData== C0_CR || u8ServiceData== C0_HCR || u8ServiceData== C0_FF)
            {
               if((stCaptionBuf.u8BufLen > 0) && (stCaptionBuf.u8BufLen <= CAPTION_BUF_SIZE))
               {
                  CC708_OSD_DrawCaptionToWindow(stCaptionBuf.u16Buf,stCaptionBuf.u8BufLen);
                  memset(stCaptionBuf.u16Buf, 0, sizeof(HI_U16)*stCaptionBuf.u8BufLen);
                  stCaptionBuf.u8BufLen = 0;
               }
            }

            if(u8ServiceData == C0_EXT1)
            {
                u8CmdLen = _DtvCC_GetEXT1CmdLen(&pu8ServiceData[u8Offset],u8ServiceLen-u8Offset);
            }

            /* cmd integrity check,cmd in more than one service */
            if(u8CmdLen > (u8ServiceLen-u8Offset))
            {
                pstCMDBuffer->u8TotalSize = u8CmdLen;
                pstCMDBuffer->u8CurSize = u8ServiceLen - u8Offset;
                memcpy(pstCMDBuffer->au8CMD,&pu8ServiceData[u8Offset],u8ServiceLen - u8Offset);
                break;
            }

            if(pfnDTVCCCmdDecoder != NULL)
            {
                pfnDTVCCCmdDecoder(&pu8ServiceData[u8Offset]);
            }

            u8Offset += u8CmdLen;
        }
        else if (u8ServiceData > 0x9f || ((0x1F < u8ServiceData) &&(u8ServiceData < 0x80)))      /*CAP*/
        {
            HI_U16 u16Caption;

            if(pu8ServiceData[u8Offset] == 0x7f)/*music unicode code*/
            {
                u16Caption = 0x266a;
            }
            else
            {
                u16Caption = pu8ServiceData[u8Offset];
            }

            stCaptionBuf.u16Buf[stCaptionBuf.u8BufLen++] = u16Caption;
            u8Offset += 1;
        }

    }

    return HI_SUCCESS;

}

/*CEA-708 P24 */
static HI_S32 _DtvCC_GetEXT1CmdLen(HI_U8 *pu8Cmd, HI_S32 s32AvalaibleLen)
{
    HI_U8 u8ByteCode;
    HI_U8 u8Length;

    u8ByteCode = GET8(pu8Cmd,1);

    /* C2 code set S7.4.7 */
    if(u8ByteCode <= 0x07)
    {
        return 2;
    }
    else if(u8ByteCode <= 0x0f)
    {
        return 3;
    }
    else if(u8ByteCode <= 0x17)
    {
        return 4;
    }
    else if(u8ByteCode <= 0x1F)
    {
        return 5;
    }

    /* C3 code set  */
    if( (u8ByteCode >= 0x80)&&(u8ByteCode <= 0x87) )
    {
        return 6;
    }
    else if( (u8ByteCode >= 0x88)&&(u8ByteCode <= 0x8f) )
    {
        return 7;
    }

    /* variable u8Length commands S7.4.8*/
    if( ( u8ByteCode & 0xf0) == 0x90 )
    {
        if( s32AvalaibleLen >= 3 )
        {
            u8Length = GET6(pu8Cmd,2,0);
            return u8Length+3;
        }
        else
        {
            return s32AvalaibleLen + 1;
        }
    }

    /*G2,G3*/
    return 2;

}


/*************************************************************************************************
 * Function name: static HI_U8 _DtvCC_DetectRstDcCmd(HI_U8 *pbuf, HI_U8 len, HI_U8 *pu8Cmd)*
 * Description: detect delay cancel and reset command before buffer service input data.                  *
 * Arguments:   pbuf: the address of the service data.                                           *
 *                     len:  the length of the service data.                                            *
 *                     pu8Cmd: pointer to return the found command.                                       *
 * Return value: if find the delay cancel or reset command, return the position of the command.  *
 * Note:                                                                                         *
 * Todo:                                                                                         *
 *************************************************************************************************/
static HI_U8 _DtvCC_DetectRstDcCmd(HI_U8 *pu8buf, HI_U8 u8BufLen, HI_U8 *pu8Cmd)
{
    HI_U8 *pu8Service = NULL;
    HI_U8 u8ServiceLen,u8Offset = 0;
    HI_U8 u8ServiceData;

    if(NULL == pu8buf || u8BufLen == 0 || pu8Cmd == NULL)
    {
        HI_ERR_CC("pu8buf pointer NULL!\n");
        return 0;
    }
    u8ServiceLen = u8BufLen;
    pu8Service = pu8buf;
    *pu8Cmd = C0_NUL;

    while(u8Offset < u8ServiceLen)
    {
        u8ServiceData = GET8(pu8Service,u8Offset);

        if(u8ServiceData < 0x20 || ((0x7f < u8ServiceData) && (u8ServiceData < 0xa0))) /*C0,C1*/
        {
            CC708_CmdMap_S stCmdMap;
            HI_S32 s32CmdLen;

            stCmdMap = DTVCCCmdMap[((u8ServiceData&0x80)>>2)|(u8ServiceData&0x1f)];
            s32CmdLen = stCmdMap.u8CMDLen;

            /*Extended code space,get ext1 cmd code length */
            if(u8ServiceData == C0_EXT1)
            {
                s32CmdLen = _DtvCC_GetEXT1CmdLen(&pu8Service[u8Offset],u8ServiceLen-u8Offset);
            }
            /* cmd integrity check */
            if(s32CmdLen > (u8ServiceLen-u8Offset))
            {
                break;
            }

            /* decode delay cancel command */
            if(u8ServiceData == C1_DLC)
            {
                DEC_TRACE("Get delay cancel command!\n");
                *pu8Cmd = C1_DLC;
                break;
            }
            else if(u8ServiceData==C1_RST)
            {
                DEC_TRACE("Get reset command!\n");
                *pu8Cmd = C1_RST;
                break;
            }

            u8Offset += s32CmdLen;
        }
        else
        {
            /* cc caption data or undefined service data */
            u8Offset ++;
        }
    }

    return u8Offset;
}

/**********************************************************************************************************************
*                                   Service Layer Decoder Function Definitions
**********************************************************************************************************************/

/********************************************************************************************
 *  put_servicedata_tofifo: put data to service_fifo  [productor]
 *  process_servicefifo will be the consumer to process data.
 *******************************************************************************************/
static HI_VOID _DtvCC_PutServiceDataToFIFO( HI_U8 *pu8Buf,HI_U8 u8BufLen)
{
    DTVCC_ServiceElement_S stSvsElement;
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    HI_U8 u8Position,n;
    HI_U8 u8Cmd = 0;

    /* pre-detect the reset/delay cancle command */
    u8Position = _DtvCC_DetectRstDcCmd(pu8Buf,u8BufLen,&u8Cmd);
    if (u8Cmd == C1_RST) /*if find reset command*/
    {
        pstCCObj->u8IsDelay = 0;
        _DtvCC_DelayTimerStop(0);

        u8Position += 1;// skip reset command
        u8BufLen -= (u8Position);// clear the data before reset command

        if(u8BufLen > 0)
        {
            memmove(pu8Buf,pu8Buf+u8Position,u8BufLen);
        }
        (HI_VOID)CC708_OSD_Reset();
    }
    else if (u8Cmd == C1_DLC) //if find delay cancle command
    {
        pstCCObj->u8IsDelay = 0;
        _DtvCC_DelayTimerStop(0);
    }

    /*Insert the remainder Buffered data to queue.*/
    if (u8BufLen > 0)
    {
        n = CCQueue_GetHeadPos(&pstCCObj->stServiceQueue);
        stSvsElement.pu8Buffer = pstCCObj->au8ServiceData[n];
        memcpy(stSvsElement.pu8Buffer,pu8Buf,u8BufLen);
        stSvsElement.u8ServiceLen = u8BufLen;

        if (!CCQueue_Insert(&pstCCObj->stServiceQueue,&stSvsElement))
        {
            HI_INFO_CC("ServiceQueue full,reset delay command \n");
            pstCCObj->u8IsDelay = 0;
            _DtvCC_DelayTimerStop(0);
        }
    }

}

static HI_S32 _DtvCC_CheckSvcBlockDataIntegrality(HI_U8 *pu8buf,HI_U8 u8BufSize)
{
    HI_S32 i;
    HI_U8 u8Data;

    for(i = 0; i < u8BufSize; )
    {
        u8Data = pu8buf[i];
        if(u8Data < 0x20 || ((0x7f < u8Data) && (u8Data < 0xa0)))    /*CMD*/
        {
            CC708_CmdMap_S stCmdMap;
            HI_S32 u32CmdLen;

            stCmdMap = DTVCCCmdMap[((u8Data&0x80)>>2)|(u8Data&0x1f)];
            u32CmdLen = stCmdMap.u8CMDLen;

            /* ext1 cmd is a variable length cmd, we should get ext1 cmd code length here */
            if(u8Data == C0_EXT1)
            {
                u32CmdLen = _DtvCC_GetEXT1CmdLen(&pu8buf[i],u8BufSize-i);
            }

            /* cmd integrity check */
            if(u32CmdLen > (u8BufSize-i))
            {
                DEC_TRACE("CMD 0x%x not complete, length:%d,CmdLen:%d\n",u8Data,(u8BufSize-i),u32CmdLen);
                return i;
            }

            i += u32CmdLen;
        }
        else
        {
            i++;
        }
    }

    return i;
}

/***************************************************************************
 * function name: _DtvCC_ParsePacketData(HI_U8 *pPacketBuf, HI_U8 u8BufLen)         *
 * description:   Service Block Parse Routine                              *
 *                Put the specific block_data to cc708 queue               *
 ***************************************************************************/
static HI_S32 _DtvCC_ParsePacketData(HI_U8 *pu8PacketBuf, HI_U8 u8BufLen)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    HI_U8 u8ServiceSize    = 0;
    HI_U8 u8HeaderSize,u8ServiceNo;
    HI_U8 u8Offset         = 0;

    DTVCC_ServiceBlock_S *pServiceBlock = &pstCCObj->stServiceBlock;
    DTVCC_Packet_S *pPacket             = &pstCCObj->stPacket;

    if( NULL == pu8PacketBuf || u8BufLen == 0 )
    {
        HI_ERR_CC("service block null!\n");
        return HI_FAILURE;
    }

    while( u8Offset < u8BufLen )
    {
        if(pstCCObj->bServiceBlockEnded == HI_TRUE)
        {
            // parse service block header
            u8ServiceSize  = GET5(pu8PacketBuf, u8Offset, 0);
            u8ServiceNo    = GET3(pu8PacketBuf, u8Offset, 5);
            u8Offset++;
            u8HeaderSize   = 1;
            DEC_TRACE("u8ServiceNo = %d,u8ServiceSize = %d\n",u8ServiceNo,u8ServiceSize);
            /*now we didn't support extend service*/
            if( (u8ServiceNo == 7) && (u8ServiceSize != 0) )
            {
                u8ServiceNo = GET6(pu8PacketBuf,u8Offset,0);
                u8Offset++;
                u8HeaderSize = 2;
            }

            /*null service block*/
            if( (u8ServiceNo == 0) || (u8ServiceSize == 0) )
            {
                continue;
            }

            if((pServiceBlock->u8CurSize + u8HeaderSize + u8ServiceSize) > pPacket->u8TotalSize)
            {
                HI_INFO_CC("Block extends past the end of packet!Reset!\n");
                (HI_VOID)CC708_DEC_Reset(0);
                break;
            }

            pServiceBlock->u8ServiceSize = u8ServiceSize;
            pServiceBlock->u8ServiceNo = u8ServiceNo;
            pServiceBlock->u8CurSize = 0;

            pstCCObj->bServiceBlockEnded = HI_FALSE;

            continue;
        }

        if((pServiceBlock->u8ServiceNo == pstCCObj->u32ServiceType) && CC708_IsStart(0))
        {
            //the follow case happened when one service block cross in two packets
            if((pServiceBlock->u8ServiceSize - pServiceBlock->u8CurSize) > (u8BufLen - u8Offset))
            {
                memcpy(&pServiceBlock->u8Data[pServiceBlock->u8CurSize],pu8PacketBuf+u8Offset,u8BufLen - u8Offset);
                pServiceBlock->u8CurSize += u8BufLen - u8Offset;
                u8Offset += u8BufLen;

                if((_DtvCC_CheckSvcBlockDataIntegrality(pServiceBlock->u8Data,
                           pServiceBlock->u8CurSize)) != pServiceBlock->u8CurSize)
                {
                    continue;
                }

                _DtvCC_PutServiceDataToFIFO( pServiceBlock->u8Data,pServiceBlock->u8CurSize);

                pServiceBlock->u8ServiceSize -= pServiceBlock->u8CurSize;
                pServiceBlock->u8CurSize = 0;
            }
            else              /*find a  servive block in a packet*/
            {
                memcpy(&pServiceBlock->u8Data[pServiceBlock->u8CurSize],
                       pu8PacketBuf+u8Offset,pServiceBlock->u8ServiceSize - pServiceBlock->u8CurSize);
                u8Offset += pServiceBlock->u8ServiceSize - pServiceBlock->u8CurSize;

                _DtvCC_PutServiceDataToFIFO( pServiceBlock->u8Data,pServiceBlock->u8ServiceSize);

                pServiceBlock->u8CurSize = 0;
                pServiceBlock->u8ServiceSize = 0;
                pServiceBlock->u8ServiceNo = 0;
                pstCCObj->bServiceBlockEnded = HI_TRUE;
            }
        }
        else    /*do not put the service data into service queue*/
        {
            if((pServiceBlock->u8ServiceSize - pServiceBlock->u8CurSize) > (u8BufLen - u8Offset))
            {
                pServiceBlock->u8CurSize += u8BufLen - u8Offset;
                u8Offset = u8BufLen;
            }
            else
            {
                u8Offset += pServiceBlock->u8ServiceSize-pServiceBlock->u8CurSize;
                pstCCObj->bServiceBlockEnded = HI_TRUE;
                pServiceBlock->u8ServiceNo = 0;
                pServiceBlock->u8ServiceSize = 0;
                pServiceBlock->u8CurSize = 0;
            }
        }
    }

    return HI_SUCCESS;
}

/**********************************************************************************************************************
*                                   Packet Layer Decoder Function Definitions
**********************************************************************************************************************/


static HI_VOID _DtvCC_ParsePacket(HI_U8 *pu8PacketBuf, HI_U8 u8PacketLen)
{
    if( NULL == pu8PacketBuf || u8PacketLen == 0 )
    {
        HI_ERR_CC("packet null or lenght zero!\n");
        return ;
    }

    /*The Caption Channel Packet consists of a 1 byte header and n-1 bytes of packet data*/
    _DtvCC_ParsePacketData(pu8PacketBuf+1,u8PacketLen-1);/*skip packet head*/
}


static inline HI_VOID _DtvCC_EndPacket(HI_VOID)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    DTVCC_Packet_S *pstPacket = &pstCCObj->stPacket;

    _DtvCC_ParsePacket(pstPacket->au8PacketData,pstPacket->u8CurSize);

    if(pstPacket->u8CurSize == pstPacket->u8TotalSize)
    {
        memset(pstPacket,0,sizeof(DTVCC_Packet_S));
        pstPacket->bStart = HI_FALSE;
        memset(&pstCCObj->stServiceBlock,0,sizeof(pstCCObj->stServiceBlock));
    }
    else
    {
        pstPacket->u8TotalSize -= pstPacket->u8CurSize;
        pstPacket->u8CurSize = 0;
    }

}


/*function:check if continuous packet*/
static HI_VOID _DtvCC_CheckPacketSequenceNo(HI_VOID)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    DTVCC_Packet_S *pstPacket = &pstCCObj->stPacket;


    /*the first time to decode packet data*/
    if(pstCCObj->s32LastSeqenceNo == INVALID_SERVICE_NUM)
    {
        pstCCObj->s32LastSeqenceNo = pstPacket->u8SeqenceNo;
    }
    else
    {
        if( pstPacket->u8SeqenceNo != ((pstCCObj->s32LastSeqenceNo + 1) & 0x03 ) )
        {
            DEC_TRACE("Sequence number error!,SeqenceNo:%d,LastSeqenceNo:%d\n",pstPacket->u8SeqenceNo,pstCCObj->s32LastSeqenceNo);
            /*invalide sequence number*/
            /*when a lost packet is detected,any partially accumulated data
                      from the previously received packet is to be discarded,and the
                      processing associated with the CC708Reset command should be performed
                      for each existing service 708 Spec P11*/
            pstCCObj->s32LastSeqenceNo = INVALID_SERVICE_NUM;

            if(!pstCCObj->u8IsDelay)
            {
                //TODU
            }
            /* clear input buffer */
            if(CC708_IsStart(0))
            {
                CC708_OSD_Reset();
            }
        }
        else
        {
            pstCCObj->s32LastSeqenceNo = pstPacket->u8SeqenceNo;
        }
    }
}

static HI_VOID _DtvCC_ParsePicUsrData_608 ( HI_BOOL bCheckATSC608, HI_U8 u8NtscCounter, HI_U8 *pau8NtscData )
{
    if( (u8NtscCounter > 0) && (u8NtscCounter < (MAX_VBI_DATA_COUNT - 1)) && bCheckATSC608 && CC608_IsStart(0))
    {
        /*There are 608 in this user data*/
        HI_U8 loop = 0;
        HI_U8 buff[3];

        for (loop = 0; loop < u8NtscCounter-2; loop += 3)
        {
            //copy to buff
            buff[0] = pau8NtscData[loop];   //field
            buff[1] = pau8NtscData[loop+1]; //ccdata1
            buff[2] = pau8NtscData[loop+2]; //ccdata2

            if (_DtvCC_OddParityCheck(buff[1]) && _DtvCC_OddParityCheck(buff[2]))
            {
                //parse normal data
                CC608_VBIParse(0,buff,3);
            }
        }
    }

    return;
}

/**********************************************************************
 * function name: _DtvCC_ParsePicUsrData(...)
 * description:   dispatch cc608(NTSC) and cc708 data
 *                put cc708 to packet buffer, 608 to vbi queue
 **********************************************************************/
static HI_S32 _DtvCC_ParsePicUsrData( HI_U8 *pu8CCPicData, HI_U8 u8CCdataLength, HI_BOOL bCheckATSC608)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);

    HI_U8 u8CCFlag = 0;
    HI_U8 u8offset = 0;
    HI_U8 u8PacketLen = 0;
    HI_U8 u8LoopTimes = 0;
    DTVCC_Packet_S *pstPacket = &pstCCObj->stPacket;

    HI_U8 au8NtscData[MAX_VBI_DATA_COUNT] = {0};
    HI_U8 u8NtscCounter = 0;

    if( (NULL == pu8CCPicData) || (u8CCdataLength == 0) )
    {
        HI_ERR_CC("Param invalid!\n");
        return HI_FAILURE;
    }

    HI_UNF_CC_VBI_DADA_S stVBIDataField1, stVBIDataField2;
    stVBIDataField1.u8FieldParity = CC608_VBI_FIELD1;
    stVBIDataField1.u8Data1 = 0;
    stVBIDataField1.u8Data2 = 0;

    stVBIDataField2.u8FieldParity = CC608_VBI_FIELD2;
    stVBIDataField2.u8Data1 = 0;
    stVBIDataField2.u8Data2 = 0;

    while( u8offset < u8CCdataLength )
    {
        u8CCFlag = pu8CCPicData[u8offset++];
        u8LoopTimes = 2;

        switch(u8CCFlag)
        {
            case PACKET_START_FLAG:  /* get a new packet,also means prepacket end*/
            {
                if(pstPacket->u8CurSize > 0)
                {
                    _DtvCC_EndPacket();
                }

                /*decode the packet length,here include the 1 byte header*/
                pstPacket->u8SeqenceNo = (pu8CCPicData[u8offset] & 0xC0) >> 6;
                u8PacketLen = pu8CCPicData[u8offset] & 0x3f;
                _DtvCC_CheckPacketSequenceNo();

                pstPacket->u8TotalSize = (u8PacketLen == 0)?(128):(u8PacketLen*2);
                if(((pstPacket->u8CurSize + 2) > MAX_DTVCC_PACKET_LEN) || ((u8offset+1) >= u8CCdataLength))
                {
                    HI_ERR_CC("packetlen:%d +2 >= MAX_LEN:%d\n",pstPacket->u8CurSize,MAX_DTVCC_PACKET_LEN);
                    return HI_FAILURE;
                }

                pstPacket->au8PacketData[pstPacket->u8CurSize++] = pu8CCPicData[u8offset++];
                pstPacket->au8PacketData[pstPacket->u8CurSize++] = pu8CCPicData[u8offset++];/*SHOULD BE TWO BYTES*/

                pstPacket->bStart = HI_TRUE;
                if((pstPacket->u8CurSize > 0) && (pstPacket->u8CurSize == pstPacket->u8TotalSize))
                {
                    _DtvCC_EndPacket();
                }

                break;
            }
            case PACKET_DATA_FLAG:
            {
                if(pstPacket->bStart)
                {
                    while((u8LoopTimes-- > 0) && (pstPacket->u8CurSize < pstPacket->u8TotalSize))
                    {
                        pstPacket->au8PacketData[pstPacket->u8CurSize++] = pu8CCPicData[u8offset++];
                        if( (pstPacket->u8CurSize > 0) && (pstPacket->u8CurSize == pstPacket->u8TotalSize) )
                        {
                            _DtvCC_EndPacket();
                            break;
                        }
                    }
                }
                break;
            }
            case PACKET_CC608_FIELD1:
            case PACKET_CC608_FIELD2:
            {
                if(PACKET_CC608_FIELD1 == u8CCFlag)
                {
                     stVBIDataField1.u8FieldParity = CC608_VBI_FIELD1;
                     stVBIDataField1.u8Data1 = pu8CCPicData[u8offset];
                     stVBIDataField1.u8Data2 = pu8CCPicData[u8offset + 1];
                }
                else
                {
                    stVBIDataField2.u8FieldParity = CC608_VBI_FIELD2;
                    stVBIDataField2.u8Data1 = pu8CCPicData[u8offset];
                    stVBIDataField2.u8Data2 = pu8CCPicData[u8offset + 1];
                }

                if((pu8CCPicData[u8offset] == 0) && (pu8CCPicData[u8offset+1]==0 ))
                {
                    u8offset +=2;
                    break;
                }

                if(u8CCFlag == PACKET_CC608_FIELD1)
                {
                    au8NtscData[u8NtscCounter++] = CC608_VBI_FIELD1;
                }
                else
                {
                    au8NtscData[u8NtscCounter++] = CC608_VBI_FIELD2;
                }
                while(u8LoopTimes-- > 0)
                {
                    if( u8offset >= u8CCdataLength)
                    {
                        HI_ERR_CC("u8offset:%d  >= u8CCdataLength:%d\n",u8offset,u8CCdataLength);
                        return HI_FAILURE;
                    }
                    au8NtscData[u8NtscCounter++] = pu8CCPicData[u8offset++];
                }

                break;
            }
            case PACKET_END_FLAG1:
            case PACKET_END_FLAG2:
            {
                if((pstPacket->u8CurSize > 0) && (pstPacket->u8CurSize >= pstPacket->u8TotalSize))
                {
                    _DtvCC_EndPacket();
                }
                break;
            }
            default:
            {
                u8offset +=2;
                break;
            }
        }
    }

    if( u8NtscCounter > 0)
    {
          (HI_VOID)CCDISP_SendVbiData(&stVBIDataField1,&stVBIDataField2);
    }

    /*one user data ,parse one time 608 data*/
    (HI_VOID)_DtvCC_ParsePicUsrData_608 ( bCheckATSC608, u8NtscCounter, &au8NtscData[0] );

    return HI_SUCCESS;
}

#if CC608_FROM_CABLE
static HI_U8 ReverseChar(HI_U8 Data)
{
    HI_U8 b0,b1,b2,b3,b4,b5,b6,b7;
    HI_U8  Reversed;

    b0 = (Data >> 0) & 0x1 ;
    b1 = (Data >> 1) & 0x1 ;
    b2 = (Data >> 2) & 0x1 ;
    b3 = (Data >> 3) & 0x1 ;
    b4 = (Data >> 4) & 0x1 ;
    b5 = (Data >> 5) & 0x1 ;
    b6 = (Data >> 6) & 0x1 ;
    b7 = (Data >> 7) & 0x1 ;
    Reversed = (b7 << 0)
             | (b6 << 1)
             | (b5 << 2)
             | (b4 << 3)
             | (b3 << 4)
             | (b2 << 5)
             | (b1 << 6)
             | (b0 << 7);
    return(Reversed);
}

static inline void _DtvCC_BitStreamInit( NTSC_BitStream_S *s, void *p_data, int i_data )
{
    s->pu8Start = (HI_U8 *)p_data;
    s->pu8Buf       = (HI_U8 *)p_data;
    s->pu8End   = s->pu8Buf + i_data;
    s->u8LeftBits  = 8;
}


static inline HI_U8 _DtvCC_BitStreamRead( NTSC_BitStream_S *s, HI_U8 read_count )
{
     static unsigned int i_mask[33] =
     {
        0x00,
        0x01,      0x03,      0x07,      0x0f,
        0x1f,      0x3f,      0x7f,      0xff,
        0x1ff,     0x3ff,     0x7ff,     0xfff,
        0x1fff,    0x3fff,    0x7fff,    0xffff,
        0x1ffff,   0x3ffff,   0x7ffff,   0xfffff,
        0x1fffff,  0x3fffff,  0x7fffff,  0xffffff,
        0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff,
        0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff};
    int      i_shr;
    unsigned int i_result = 0;

    while( read_count > 0 )
    {
        if( s->pu8Buf >= s->pu8End )
        {
            break;
        }

        if( ( i_shr = s->u8LeftBits - read_count ) >= 0 )/* more in the buffer than requested */
        {
            i_result |= ( *s->pu8Buf >> i_shr )&i_mask[read_count];
            s->u8LeftBits -= read_count;
            if( s->u8LeftBits == 0 )
            {
                s->pu8Buf++;
                s->u8LeftBits = 8;
            }
            return( i_result );
        }
        else /* less in the buffer than requested */
        {
           if(s->u8LeftBits >= 33)
           {
                break;
           }
           i_result |= (*s->pu8Buf&i_mask[s->u8LeftBits]) << (0-i_shr);
           read_count  -= s->u8LeftBits;
           s->pu8Buf++;
           s->u8LeftBits = 8;
        }
    }

    return( i_result );
}

static HI_S32 _DtvCC_DecodeCABLE(HI_U8 *pBuf, HI_U8 BufLen, HI_BOOL bTopFieldFirst)
{
    HI_U8 cc_invalid = 1;
    HI_U8 vbi_data_flag = 0,field_number=0;
    HI_U8 cc_data1=0,cc_data2=0;
    HI_U8 ccdata1=0,ccdata2=0;
    HI_U8 ccCount = 0,i=0;
    HI_U8 pucCCData[3];
    NTSC_BitStream_S s;

    if( NULL == pBuf || BufLen == 0 )
    {
        HI_ERR_CC("pBuf pointer NULL!\n");
        return -1;
    }

    if(!CC608_IsStart(0))
    {
        return 0;
    }

    _DtvCC_BitStreamInit(&s,pBuf,BufLen);

    vbi_data_flag = _DtvCC_BitStreamRead(&s,8);
    if(vbi_data_flag & 0x01)
    {
        ccCount = _DtvCC_BitStreamRead(&s,5);
        HI_UNF_CC_VBI_DADA_S stVBIDataField1,stVBIDataField2;
        stVBIDataField1.u8FieldParity = CC608_VBI_FIELD1;
        stVBIDataField1.u8Data1 = 0x80;
        stVBIDataField1.u8Data2 = 0x80;

         stVBIDataField2.u8FieldParity = CC608_VBI_FIELD2;
         stVBIDataField2.u8Data1 = 0x80;
         stVBIDataField2.u8Data2 = 0x80;
        
        for(i=0;i<ccCount;i++)
        {
            (HI_VOID)_DtvCC_BitStreamRead(&s,2);//priority: 2bits
            field_number = _DtvCC_BitStreamRead(&s,2);//field_number: 2bits
            (HI_VOID)_DtvCC_BitStreamRead(&s,5);//line_offset: 5bits
            cc_data1 = _DtvCC_BitStreamRead(&s,8);//cc1: 8bits
            cc_data2 = _DtvCC_BitStreamRead(&s,8);//cc2: 8bits
            (HI_VOID)_DtvCC_BitStreamRead(&s,1);//marker_bit: 1bits

            //revert ccdata1 and ccdata2
            ccdata1 = ReverseChar(cc_data1);
            ccdata2 = ReverseChar(cc_data2);

            // Field_number is either
            //  0 .. forbiden
            //  1 .. field 1 (odd)
            //  2 .. field 2 (even)
            //  3 .. repeated, from repeat_first_field, effectively field 1
            if (field_number < 1)
            {
                continue;
            }
            field_number = (field_number - 1) & 0x01;
            // top_field_first also affects to which field the caption belongs.
            if(HI_FALSE == bTopFieldFirst)
            {
                field_number ^= 0x01;
            }
            if(field_number == 1)
            {
                pucCCData[0] = CC608_VBI_FIELD2; /*field number*/
            }
            else
            {
                pucCCData[0] = CC608_VBI_FIELD1; /*field number*/
            }

            pucCCData[1] = ccdata1 & 0x7f;
            pucCCData[2] = ccdata2 & 0x7f;

            if(cc_invalid == 1)
            {
                if(CC608_VBI_FIELD1==pucCCData[0])
                {
                     stVBIDataField1.u8FieldParity =  pucCCData[0] ;
                     stVBIDataField1.u8Data1 = ccdata1;
                     stVBIDataField1.u8Data2 = ccdata2;
                }
                else
                {
                     stVBIDataField2.u8FieldParity =  pucCCData[0] ;
                     stVBIDataField2.u8Data1 = ccdata1;
                     stVBIDataField2.u8Data2 = ccdata2;
                }
                
            }


            if( (pucCCData[1] != 0 || pucCCData[2] != 0) && cc_invalid == 1 )
            {
                CC608_VBIParse(0, pucCCData, 3);
            }
        }

        (HI_VOID)CCDISP_SendVbiData(&stVBIDataField1,&stVBIDataField2);

        if(ccCount > 0)
        {
            return 1;
        }
    }
    return 0;
}

static HI_S32 _DtvCC_DecodeSAUD(HI_U8 *pBuf, HI_U8 BufLen, HI_BOOL bCheckATSC608)
{
    HI_U8 saud_type = 0,offset = 0;
    HI_U8 cc_count = 0;
    int i,field_num,ccdata1,ccdata2;
    HI_U8 au8608Data[3];

    if( pBuf == NULL || BufLen == 0 )
    {
        return HI_FAILURE;
    }
    saud_type = GET8(pBuf,offset);
    offset++;
    if( saud_type != 0x04 )
    {
        return HI_FAILURE;
    }
    cc_count = GET8(pBuf,offset);
    offset++;
    cc_count = (cc_count&0x1f);
    if( cc_count*3 + offset > BufLen )
    {
        HI_ERR_CC("invalide cc_count:%d for saud data BufLen:%d,underflow\n",cc_count, BufLen);
        return HI_FAILURE;
    }
    for(i=0; i<cc_count; i++)
    {
        field_num = GET8(pBuf,offset);
        field_num = (field_num&0x03);
        offset++;
        ccdata1 = GET8(pBuf,offset);
        offset++;
        ccdata2 = GET8(pBuf,offset);
        offset++;

        /*field number*/
        if(field_num ==1 )
        {
            au8608Data[0] = CC608_VBI_FIELD1;
        }
        else if(field_num ==2)
        {
            au8608Data[0] = CC608_VBI_FIELD2;
        }
        else if(field_num ==3)
        {
            au8608Data[0] = CC608_VBI_FIELD2;
        }

        au8608Data[1] = ccdata1 & 0x7f;
        au8608Data[2] = ccdata2 & 0x7f;

        if( (ccdata1 != 0 || ccdata2 != 0)&& bCheckATSC608 )
        {
            (HI_VOID)CC608_VBIParse(0, au8608Data, 3);
        }
    }
    return HI_SUCCESS;
}

#endif
/*********************************************************************************
* function name: Decode_ATSC()                                                  *
* description:   decode the atsc cc according to the SCTE21 P15                 *
*                the buffer passed into this function all with the identifier   *
*                0x47413934 and the buffer begin at the user_data_type_code     *
*********************************************************************************/
static HI_S32 _DtvCC_DecodeATSC(HI_U8 *pu8Buf, HI_U8 u8BufLen, HI_BOOL bCheckATSC608)
{
    HI_U8 u8Offset = 0;
    HI_U8 u8ProcessFlag = 0;
    HI_U8 u8DataType = 0;
    HI_U8 u8ccCount = 0;

    if(NULL == pu8Buf || 0 == u8BufLen )
    {
        HI_ERR_CC("\nParam invalid\n");
        return HI_FAILURE;
    }
    u8DataType = GET8(pu8Buf,u8Offset);
    u8Offset++;
    switch(u8DataType)
    {
    case USER_DATA_TYPE_CODE:    /*CC*/
        u8ProcessFlag = GET1(pu8Buf,u8Offset,6);
        if(!u8ProcessFlag)        /*needn't deal with the cc data*/
        {
            HI_ERR_CC("\nProcess flag is 0\n");
            return HI_FAILURE;
        }
        u8ccCount = GET5(pu8Buf,u8Offset,0);
        u8Offset += 2;            /*include em_data(reserve) u8Offset*/

        if((u8ccCount*3) >= (u8BufLen - u8Offset))
        {
            HI_ERR_CC("Data len is less than cc data in stream!");
            return HI_FAILURE;
        }

        /*check ccCount validation, check marker_bits*/
        if((pu8Buf[u8Offset + u8ccCount*3] != 0xFF) && (pu8Buf[u8Offset + u8ccCount*3] != 0xF8))
        {
            HI_ERR_CC("Invalid userdata mask value:%#x !\n",pu8Buf[u8Offset + u8ccCount*3 ]);
        }

        (HI_VOID)_DtvCC_ParsePicUsrData(&pu8Buf[u8Offset], u8ccCount*3, bCheckATSC608);

        break;
    case 0x04:

        break;
        case 0x05:

        break;
        case 0x06:

        break;
    default:
        HI_ERR_CC("User Data type not match: 0x%x\n",u8DataType);
        return HI_FAILURE;
    }
    return HI_SUCCESS;
}

/*****************************************************************************
*                    export Function
*****************************************************************************/
HI_S32 CC708_DEC_Start(HI_U8 u8ModuleID)
{
    stCaptionBuf.u8BufLen = 0;
    _DtvCC_DelayTimerInit(u8ModuleID);

    return HI_SUCCESS;
}

HI_S32 CC708_DEC_Stop(HI_U8 u8ModuleID)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(u8ModuleID);
    if( pstCCObj == NULL )
    {
        HI_ERR_CC("Invalid module id!\n");
        return HI_FAILURE;
    }

    if (pstCCObj->u8IsDelay)
    {
        pstCCObj->u8IsDelay = 0;
        _DtvCC_DelayTimerStop(u8ModuleID);
    }

    return HI_SUCCESS;
}

HI_S32 CC708_DEC_Reset(HI_U8 u8ModuleID)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(u8ModuleID);
    if( pstCCObj == NULL )
    {
        HI_ERR_CC("Invalid module id!\n");
        return HI_FAILURE;
    }

    memset(&pstCCObj->stCMDBuffer, 0, sizeof(DTVCC_CMDBuffer_S));
    memset(&pstCCObj->stPacket, 0, sizeof(DTVCC_Packet_S));
    memset(&pstCCObj->stServiceBlock, 0, sizeof(DTVCC_ServiceBlock_S));

    if(pstCCObj->u8IsDelay)
    {
        pstCCObj->u8IsDelay = 0;
    }

    return HI_SUCCESS;
}

HI_S32 CC708_DEC_UserDataParse(HI_U8 *pu8UserData, HI_U32 u32DataLen, HI_BOOL bTopFieldFirst)
{
    HI_S32 s32Ret = 0;
    HI_U32 u32offset = 0;
    HI_U32 u32DataType = 0;
    HI_U8 *pu8Buf = pu8UserData;
    HI_BOOL bCheckATSC608 = HI_TRUE;

    if(HI_NULL == pu8UserData || 0 == u32DataLen )
    {
        HI_ERR_CC("\nParam invalid\n");
        return HI_FAILURE;
    }

    /*Userdata from AVPLAY is pure data ,not include the userdata head*/
    while (u32offset < u32DataLen)
    {
#if CC608_FROM_CABLE
        if(CABLE_DATA == pu8Buf[u32offset])
        {
            u32offset++;
            s32Ret = _DtvCC_DecodeCABLE( &pu8UserData[u32offset],(HI_U8)(u32DataLen-u32offset), bTopFieldFirst);
            if(1 == s32Ret)
            {
                bCheckATSC608 = HI_FALSE;
            }

            while(u32offset < u32DataLen)
            {
                if((pu8Buf[u32offset] == 0x00) &&
                    (pu8Buf[u32offset+1] == 0x00) &&
                        (pu8Buf[u32offset+2] == 0x01))
                {
                    u32offset += 3;
                    break;
                }
                else
                {
                    u32offset++;
                }
            }
            continue;
        }
#endif

        u32DataType = GET32(pu8Buf,u32offset);
        u32offset += 4;

        if(ATSC_IDENTIFIER == u32DataType) //atsc
        {
            s32Ret = _DtvCC_DecodeATSC( &pu8UserData[u32offset],(HI_U8)(u32DataLen-u32offset),bCheckATSC608);
            if( s32Ret == HI_FAILURE)
            {
                HI_ERR_CC("\nDecode_ATSC failed\n");
            }
            break;
        }

#if CC608_FROM_CABLE

        else if( SAUD_IDENTIFIER == u32DataType ) //saud data
        {
            s32Ret = _DtvCC_DecodeSAUD(&pu8UserData[u32offset],(HI_U8)(u32DataLen-u32offset),bCheckATSC608);
            if( HI_FAILURE == s32Ret  )
            {
                HI_ERR_CC("\nDecode_SAUD failed\n");
                continue;
            }
            break;
        }
#endif
        else
        {
            HI_ERR_CC("ERROR:u32DataType:%#x\n",u32DataType);
            continue;
        }
    }
    return HI_SUCCESS;
}

HI_S32 CC708_DEC_ProcessServicefifo(HI_VOID)
{
    HI_S32 s32Ret              = HI_SUCCESS;
    CC708_OBJECT_S *pstCCObj     = CC708_OBJ_GetHandle(0);
    TRI_QUEUE *pstServiceQueue = &(pstCCObj->stServiceQueue);
    DTVCC_ServiceElement_S stSvsElement;

    //if not delay, we get queue element and decoder it to graph cmd.others we directly return.
    while(!CCQueue_IsEmpty(pstServiceQueue) && !pstCCObj->u8IsDelay)
    {
        if (CCQueue_Get(pstServiceQueue, &stSvsElement))
        {
            s32Ret = _DtvCC_ParseServiceBlock(stSvsElement.pu8Buffer,stSvsElement.u8ServiceLen);
            if(HI_FAILURE == s32Ret)
            {
                HI_ERR_CC("_DtvCC_ParseServiceBlock failed!\n");
            }
            CCQueue_Remove(pstServiceQueue,&stSvsElement);
        }
    }
    return s32Ret;
}

/******************************************************************************************************
*                                   Coding Layer Decoder Function Definitions
*******************************************************************************************************/


static void _DtvCC_NulCmd(HI_U8 *pu8Cmd)
{

}

static void _DtvCC_ETXCmd(HI_U8 *pu8Cmd)
{
    DEC_TRACE("C0_ETX command!%#x\n",*pu8Cmd);

    /* The ETX code is required at the end of a caption text segment to */
    /* terminate the segment when the segment is not immediately followed */
    /* by another caption command. Spec P17 */
    /* So we should draw received caption here*/
    CC708_OSD_ETX();
}

static void _DtvCC_BSCmd(HI_U8 *pu8Cmd)
{
    DEC_TRACE("C0_BS command! %#x\n",*pu8Cmd);
    CC708_OSD_BSText();
}

static void _DtvCC_FFCmd(HI_U8 *pu8Cmd)
{
    DEC_TRACE("C0_ff command!%#x\n",*pu8Cmd);
    CC708_OSD_FFText();
}

static void _DtvCC_CRCmd(HI_U8 *pu8Cmd)
{
    DEC_TRACE("C0_CR  %#x\n",*pu8Cmd);
    CC708_OSD_CRText();
}

static void _DtvCC_HCRCmd(HI_U8 *pu8Cmd)
{
    DEC_TRACE("CO_HCR command %#x\n",*pu8Cmd);
    CC708_OSD_HCRText();
}

static void _DtvCC_EXT1Cmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8Byte;
    HI_U16 u16Caption = 0;

    u8Byte = GET8(pu8Cmd,1);

    /* C2 C3 code set, just skip */
    if((u8Byte < 0x20)||((u8Byte >= 0x80)&&(u8Byte < 0x90)))
    {
        return;
    }

    /* variable length commands, just skip */
    if( (u8Byte & 0xf0) == 0x90 )
    {
        return ;
    }

    /* G2 code set */
    if(u8Byte < 0x80)
    {
        u16Caption = DTVCCG2Code2UnicodeMap[u8Byte-0x20];

        /* if it is a TSP or NBTSP, treat NBTSP as 0x1020 */
        if((u16Caption == 0x1020) ||(u16Caption == 0x1021))
        {
            u16Caption = 0x1020;
        }

    }
    /* G3 code set */
    else if(u8Byte >= 0xA0)
    {
        u16Caption = DTVCCG3Code2UnicodeMap[u8Byte-0xA0];
    }

    stCaptionBuf.u16Buf[stCaptionBuf.u8BufLen++] = u16Caption;

    return ;
}

static const HI_U16 ksc5601_2uni_page21[1115] = {
  /* 0x21 */
  0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003,
  0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c,
  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
  0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7,
  0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033,
  0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220,
  0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b,
  0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1,
  0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191,
  0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d,
  0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282,
  0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2,
  /* 0x22 */
  0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8,
  0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0,
  0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0,
  0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663,
  0x2299, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5,
  0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c,
  0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196,
  0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116,
  0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 0x20ac, 0x00ae, 0x327e,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x23 */
  0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08,
  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10,
  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
  0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20,
  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
  0xff39, 0xff3a, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40,
  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
  0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3,
  /* 0x24 */
  0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138,
  0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140,
  0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
  0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150,
  0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158,
  0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160,
  0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168,
  0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170,
  0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178,
  0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180,
  0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188,
  0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e,
  /* 0x25 */
  0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
  0x2178, 0x2179, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2160,
  0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
  0x2169, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x26 */
  0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c,
  0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b,
  0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f,
  0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542,
  0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d,
  0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a,
  0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a,
  0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546,
  0x2547, 0x2548, 0x2549, 0x254a, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x27 */
  0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4,
  0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e,
  0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f,
  0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1,
  0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9,
  0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc,
  0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394,
  0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5,
  0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac,
  0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x33c6, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x28 */
  0x00c6, 0x00d0, 0x00aa, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x013f,
  0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0xfffd,
  0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267,
  0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f,
  0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277,
  0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3,
  0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db,
  0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3,
  0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461,
  0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
  0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154,
  0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e,
  /* 0x29 */
  0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140,
  0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149,
  0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207,
  0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f,
  0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217,
  0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f,
  0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7,
  0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af,
  0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475,
  0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d,
  0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3,
  0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084,
  /* 0x2a */
  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x2b */
  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0x2c */
  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
  0x044f,
};
static const HI_U16 ksc5601_2uni_page30[2350] = {
  /* 0x30 */
  0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10,
  0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19,
  0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d,
  0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b,
  0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77,
  0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86,
  0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d,
  0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf,
  0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4,
  0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7,
  0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5,
  0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06,
  /* 0x31 */
  0xad0c, 0xad0d, 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29,
  0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45,
  0xad47, 0xad49, 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c,
  0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c,
  0xad7d, 0xad7f, 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90,
  0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8,
  0xadd0, 0xadd1, 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9,
  0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d,
  0xae14, 0xae30, 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40,
  0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e,
  0xae50, 0xae54, 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61,
  0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78,
  /* 0x32 */
  0xae79, 0xae7b, 0xae7c, 0xae7d, 0xae84, 0xae85, 0xae8c, 0xaebc,
  0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0,
  0xaed1, 0xaed8, 0xaed9, 0xaedc, 0xaee8, 0xaeeb, 0xaeed, 0xaef4,
  0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d,
  0xaf30, 0xaf32, 0xaf34, 0xaf3c, 0xaf3d, 0xaf3f, 0xaf41, 0xaf42,
  0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65,
  0xaf79, 0xaf80, 0xaf84, 0xaf88, 0xaf90, 0xaf91, 0xaf95, 0xaf9c,
  0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb,
  0xafcd, 0xafce, 0xafd4, 0xafdc, 0xafe8, 0xafe9, 0xaff0, 0xaff1,
  0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014,
  0xb01c, 0xb01d, 0xb028, 0xb044, 0xb045, 0xb048, 0xb04a, 0xb04c,
  0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059,
  /* 0x33 */
  0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c, 0xb08d, 0xb08f,
  0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1,
  0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af,
  0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5,
  0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4, 0xb0d8, 0xb0e0,
  0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113,
  0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123, 0xb124, 0xb125,
  0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140,
  0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154, 0xb155, 0xb158,
  0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188,
  0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194, 0xb198, 0xb19c,
  0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd,
  /* 0x34 */
  0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd,
  0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217,
  0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268,
  0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290,
  0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3,
  0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9,
  0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2,
  0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee,
  0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa,
  0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311,
  0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358,
  0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365,
  /* 0x35 */
  0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378,
  0xb380, 0xb381, 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394,
  0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb,
  0xb3cc, 0xb3ce, 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db,
  0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c,
  0xb420, 0xb428, 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454,
  0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488,
  0xb49d, 0xb4a4, 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0,
  0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3,
  0xb4e4, 0xb4e6, 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514,
  0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528,
  0xb529, 0xb52a, 0xb530, 0xb531, 0xb534, 0xb538,
  /* 0x36 */
  0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d,
  0xb550, 0xb554, 0xb55c, 0xb55d, 0xb55f, 0xb560, 0xb561, 0xb5a0,
  0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3,
  0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc,
  0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611,
  0xb614, 0xb618, 0xb625, 0xb62c, 0xb634, 0xb648, 0xb664, 0xb668,
  0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4,
  0xb6f0, 0xb6f4, 0xb6f8, 0xb700, 0xb701, 0xb705, 0xb728, 0xb729,
  0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748,
  0xb74c, 0xb754, 0xb755, 0xb760, 0xb764, 0xb768, 0xb770, 0xb771,
  0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d,
  0xb78f, 0xb790, 0xb791, 0xb792, 0xb796, 0xb797,
  /* 0x37 */
  0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac,
  0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9, 0xb7ec, 0xb7ed,
  0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807,
  0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819, 0xb81b, 0xb81d,
  0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838,
  0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c, 0xb85d, 0xb860,
  0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d,
  0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1, 0xb8c3, 0xb8c5,
  0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9,
  0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd, 0xb904, 0xb918,
  0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951,
  0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969,
  /* 0x38 */
  0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985,
  0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0,
  0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc,
  0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db,
  0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec,
  0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01,
  0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48,
  0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58,
  0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71,
  0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8,
  0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb,
  0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc,
  /* 0x39 */
  0xbb00, 0xbb04, 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20,
  0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c,
  0xbb3d, 0xbb3e, 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f,
  0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c,
  0xbb90, 0xbba4, 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4,
  0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00,
  0xbc02, 0xbc08, 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11,
  0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d,
  0xbc1e, 0xbc1f, 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30,
  0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45,
  0xbc49, 0xbc4c, 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88,
  0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97,
  /* 0x3a */
  0xbc99, 0xbc9a, 0xbca0, 0xbca1, 0xbca4, 0xbca7, 0xbca8, 0xbcb0,
  0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4,
  0xbccd, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4,
  0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09,
  0xbd10, 0xbd14, 0xbd24, 0xbd2c, 0xbd40, 0xbd48, 0xbd49, 0xbd4c,
  0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84,
  0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd90, 0xbd91, 0xbd93, 0xbd95,
  0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5,
  0xbdd8, 0xbddc, 0xbde9, 0xbdf0, 0xbdf4, 0xbdf8, 0xbe00, 0xbe03,
  0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f,
  0xbe44, 0xbe45, 0xbe48, 0xbe4c, 0xbe4e, 0xbe54, 0xbe55, 0xbe57,
  0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64,
  /* 0x3b */
  0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75, 0xbe7b,
  0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90,
  0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1, 0xbed4, 0xbed7,
  0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08,
  0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf40, 0xbf41,
  0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5,
  0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf, 0xbfe1, 0xc03c,
  0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091,
  0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5, 0xc0ac, 0xc0ad,
  0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd,
  0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9, 0xc0cc, 0xc0d0,
  0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4,
  /* 0x3c */
  0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100,
  0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f,
  0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f,
  0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148,
  0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c,
  0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178,
  0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c,
  0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0,
  0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0,
  0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200,
  0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c,
  0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d,
  /* 0x3d */
  0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254,
  0xc258, 0xc260, 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c,
  0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b,
  0xc29d, 0xc2a4, 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5,
  0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb,
  0xc2ec, 0xc2ed, 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb,
  0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314,
  0xc315, 0xc318, 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345,
  0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c,
  0xc37d, 0xc384, 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc,
  0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5,
  0xc3f8, 0xc408, 0xc410, 0xc424, 0xc42c, 0xc430,
  /* 0x3e */
  0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c,
  0xc474, 0xc475, 0xc479, 0xc480, 0xc494, 0xc49c, 0xc4b8, 0xc4bc,
  0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500,
  0xc501, 0xc50c, 0xc510, 0xc514, 0xc51c, 0xc528, 0xc529, 0xc52c,
  0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548,
  0xc549, 0xc54a, 0xc54c, 0xc54d, 0xc54e, 0xc553, 0xc554, 0xc555,
  0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564,
  0xc568, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575, 0xc57c, 0xc57d,
  0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595,
  0xc597, 0xc598, 0xc59c, 0xc5a0, 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8,
  0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6,
  0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cc, 0xc5ce,
  /* 0x3f */
  0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5,
  0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6, 0xc5f7, 0xc5fc,
  0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607,
  0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b, 0xc61c, 0xc624,
  0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634,
  0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641, 0xc644, 0xc648,
  0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660,
  0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c, 0xc680, 0xc688,
  0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4,
  0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4, 0xc6b8, 0xc6b9,
  0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0,
  0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8,
  /* 0x40 */
  0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705,
  0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721,
  0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c,
  0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751,
  0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c,
  0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d,
  0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a,
  0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a,
  0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad,
  0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8,
  0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8,
  0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a,
  /* 0x41 */
  0xc810, 0xc811, 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820,
  0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840,
  0xc848, 0xc849, 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874,
  0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887,
  0xc88b, 0xc88c, 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8,
  0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7,
  0xc8d9, 0xc8e0, 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900,
  0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918,
  0xc92c, 0xc934, 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961,
  0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c,
  0xc990, 0xc998, 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4,
  0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3,
  /* 0x42 */
  0xc9d5, 0xc9d6, 0xc9d9, 0xc9da, 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2,
  0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8,
  0xc9f9, 0xc9fc, 0xca00, 0xca08, 0xca09, 0xca0b, 0xca0c, 0xca0d,
  0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c,
  0xca5d, 0xca5f, 0xca60, 0xca61, 0xca68, 0xca7d, 0xca84, 0xca98,
  0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1,
  0xcad3, 0xcad8, 0xcad9, 0xcae0, 0xcaec, 0xcaf4, 0xcb08, 0xcb10,
  0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c,
  0xcb50, 0xcb58, 0xcb59, 0xcb5d, 0xcb64, 0xcb78, 0xcb79, 0xcb9c,
  0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10,
  0xcc14, 0xcc1c, 0xcc1d, 0xcc21, 0xcc22, 0xcc27, 0xcc28, 0xcc29,
  0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b,
  /* 0x43 */
  0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48, 0xcc4c, 0xcc54,
  0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68,
  0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0, 0xcca8, 0xcca9,
  0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4,
  0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4, 0xccec, 0xccf0,
  0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b,
  0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c, 0xcd60, 0xcd64,
  0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95,
  0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9, 0xcdb0, 0xcdc4,
  0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb,
  0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19, 0xce20, 0xce21,
  0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35,
  /* 0x44 */
  0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69,
  0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85,
  0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1,
  0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5,
  0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9,
  0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15,
  0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31,
  0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67,
  0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c,
  0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8,
  0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011,
  0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c,
  /* 0x45 */
  0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060,
  0xd06c, 0xd06d, 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4,
  0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0,
  0xd0c1, 0xd0c4, 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4,
  0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef,
  0xd0f0, 0xd0f1, 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138,
  0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d,
  0xd150, 0xd154, 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c,
  0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0,
  0xd1b1, 0xd1b3, 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4,
  0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234,
  0xd23c, 0xd23d, 0xd23f, 0xd241, 0xd248, 0xd25c,
  /* 0x46 */
  0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295,
  0xd29c, 0xd2a0, 0xd2a4, 0xd2ac, 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc,
  0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8,
  0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0, 0xd2f1, 0xd2f4, 0xd2f8, 0xd300,
  0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314,
  0xd316, 0xd31c, 0xd31d, 0xd31f, 0xd320, 0xd321, 0xd325, 0xd328,
  0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d,
  0xd344, 0xd345, 0xd37c, 0xd37d, 0xd380, 0xd384, 0xd38c, 0xd38d,
  0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8,
  0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4, 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5,
  0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed,
  0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd, 0xd3ff, 0xd401,
  /* 0x47 */
  0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d,
  0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480, 0xd482, 0xd488,
  0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4,
  0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8, 0xd4fb, 0xd4fd,
  0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d,
  0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551, 0xd558, 0xd559,
  0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574,
  0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587, 0xd588, 0xd589,
  0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8,
  0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8, 0xd5ec, 0xd5f4,
  0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610,
  0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620,
  /* 0x48 */
  0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648,
  0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c,
  0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c,
  0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac,
  0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1,
  0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5,
  0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c,
  0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738,
  0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756,
  0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769,
  0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789,
  0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d,
};
static const HI_U16 ksc5601_2uni_page4a[4888] = {
  /* 0x4a */
  0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5,
  0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c,
  0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36,
  0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404,
  0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3,
  0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7,
  0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5,
  0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593,
  0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910,
  0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be,
  0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3,
  0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95,
  /* 0x4b */
  0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808,
  0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f,
  0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221,
  0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7,
  0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea,
  0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0xf900,
  0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9,
  0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da,
  0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0xf902, 0x907d,
  0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106,
  0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091,
  0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2,
  /* 0x4c */
  0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9,
  0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694,
  0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b,
  0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a,
  0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac,
  0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770,
  0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f,
  0x66bb, 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5,
  0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93,
  0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1,
  0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x5951,
  0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0,
  /* 0x4d */
  0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b,
  0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9,
  0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7,
  0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc,
  0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6,
  0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0xf903, 0x8f9c,
  0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2,
  0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606,
  0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904,
  0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050,
  0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2,
  0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc,
  /* 0x4e */
  0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846,
  0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec,
  0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50,
  0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec,
  0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38,
  0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b,
  0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0,
  0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1,
  0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821,
  0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e,
  0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18,
  0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe,
  /* 0x4f */
  0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7,
  0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb,
  0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396,
  0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205,
  0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1,
  0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b,
  0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4,
  0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae,
  0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8,
  0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5,
  0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d,
  0x8ecc, 0x994b, 0xf906, 0x6677, 0x6b78, 0x8cb4,
  /* 0x50 */
  0x9b3c, 0xf907, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea,
  0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035,
  0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908,
  0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699,
  0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e,
  0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909,
  0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd,
  0x82a9, 0x887e, 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca,
  0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc,
  0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x5668, 0x573b,
  0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e,
  0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3,
  /* 0x51 */
  0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23,
  0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3,
  0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a,
  0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18,
  0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e,
  0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854,
  0x91d1, 0x55ab, 0x513a, 0xf90b, 0xf90c, 0x5a1c, 0x61e6, 0xf90d,
  0x62cf, 0x62ff, 0xf90e, 0xf90f, 0xf910, 0xf911, 0xf912, 0xf913,
  0x90a3, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919,
  0xf91a, 0xf91b, 0xf91c, 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f,
  0x96e3, 0xf920, 0x634f, 0x637a, 0x5357, 0xf921, 0x678f, 0x6960,
  0x6e73, 0xf922, 0x7537, 0xf923, 0xf924, 0xf925,
  /* 0x52 */
  0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, 0x5a18, 0xf928, 0xf929,
  0xf92a, 0xf92b, 0xf92c, 0x4e43, 0xf92d, 0x5167, 0x5948, 0x67f0,
  0x8010, 0xf92e, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c,
  0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0xf92f, 0x5974, 0x5f29,
  0x6012, 0xf930, 0xf931, 0xf932, 0x7459, 0xf933, 0xf934, 0xf935,
  0xf936, 0xf937, 0xf938, 0x99d1, 0xf939, 0xf93a, 0xf93b, 0xf93c,
  0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0x6fc3,
  0xf944, 0xf945, 0x81bf, 0x8fb2, 0x60f1, 0xf946, 0xf947, 0x8166,
  0xf948, 0xf949, 0x5c3f, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e,
  0xf94f, 0xf950, 0xf951, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0xf952,
  0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, 0xf959,
  0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336,
  /* 0x53 */
  0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7,
  0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde,
  0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8,
  0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b,
  0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7,
  0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510,
  0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6,
  0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1,
  0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8,
  0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230,
  0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6,
  0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843,
  /* 0x54 */
  0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc,
  0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48,
  0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2,
  0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b,
  0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e,
  0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd,
  0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c,
  0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597,
  0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0xf95a, 0x8c46, 0x9017,
  0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97,
  0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127,
  0x9a30, 0x5587, 0x61f6, 0xf95b, 0x7669, 0x7f85,
  /* 0x55 */
  0x863f, 0x87ba, 0x88f8, 0x908f, 0xf95c, 0x6d1b, 0x70d9, 0x73de,
  0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, 0xf95e, 0x4e82, 0x5375,
  0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, 0x9e1e, 0x524c, 0x8fa3,
  0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, 0x7c43, 0x7e9c, 0x85cd,
  0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, 0x5eca, 0x6717, 0x6d6a,
  0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, 0x4f86, 0x5d0d, 0x5fa0,
  0x840a, 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9,
  0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b,
  0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e,
  0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62,
  0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b,
  0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23,
  /* 0x56 */
  0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a,
  0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582,
  0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0xf95f,
  0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046,
  0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7,
  0x79ae, 0x91b4, 0x96b7, 0x52de, 0xf960, 0x6488, 0x64c4, 0x6ad3,
  0x6f5e, 0x7018, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def,
  0x8f05, 0x9732, 0x9b6f, 0x9dfa, 0x9e75, 0x788c, 0x797f, 0x7da0,
  0x83c9, 0x9304, 0x9e7f, 0x9e93, 0x8ad6, 0x58df, 0x5f04, 0x6727,
  0x7027, 0x74cf, 0x7c60, 0x807e, 0x5121, 0x7028, 0x7262, 0x78ca,
  0x8cc2, 0x8cda, 0x8cf4, 0x96f7, 0x4e86, 0x50da, 0x5bee, 0x5ed6,
  0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc,
  /* 0x57 */
  0x907c, 0x9b27, 0x9f8d, 0x58d8, 0x5a41, 0x5c62, 0x6a13, 0x6dda,
  0x6f0f, 0x763b, 0x7d2f, 0x7e37, 0x851e, 0x8938, 0x93e4, 0x964b,
  0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409,
  0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e,
  0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b,
  0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, 0x808b, 0x51dc, 0x51cc,
  0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, 0x4fda, 0x5229, 0x5398,
  0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281,
  0x72f8, 0x7406, 0x7483, 0xf962, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8,
  0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d,
  0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f,
  0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c,
  /* 0x58 */
  0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8,
  0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab,
  0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d,
  0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513,
  0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab,
  0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b,
  0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb,
  0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164,
  0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c,
  0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, 0x840c,
  0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704,
  0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5,
  /* 0x59 */
  0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f,
  0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4,
  0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478,
  0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261,
  0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28,
  0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9,
  0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999,
  0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7,
  0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab,
  0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46,
  0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8,
  0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587,
  /* 0x5a */
  0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff,
  0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae,
  0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e,
  0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d,
  0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9,
  0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd,
  0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94,
  0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1,
  0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591,
  0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc,
  0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812,
  0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51,
  /* 0x5b */
  0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d,
  0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9,
  0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa,
  0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6,
  0x9632, 0x9f90, 0x500d, 0x4ff3, 0xf963, 0x57f9, 0x5f98, 0x62dc,
  0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4,
  0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70,
  0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a,
  0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, 0x98dc,
  0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e,
  0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb,
  0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656,
  /* 0x5c */
  0x78a7, 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a,
  0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19,
  0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5,
  0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08,
  0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a,
  0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14,
  0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f,
  0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5,
  0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0,
  0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702,
  0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256,
  0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66,
  /* 0x5d */
  0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0xf966, 0x6276, 0x6577, 0x65a7,
  0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151,
  0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb,
  0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7,
  0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff,
  0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde,
  0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, 0x5f17, 0x5f7f,
  0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15,
  0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2,
  0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6,
  0x6bd7, 0x6bd8, 0x6cb8, 0xf968, 0x7435, 0x75fa, 0x7812, 0x7891,
  0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5,
  /* 0x5e */
  0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb,
  0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c,
  0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7,
  0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b,
  0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2,
  0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb,
  0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c,
  0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23,
  0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9,
  0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df,
  0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc,
  0x99df, 0x9e9d, 0x524a, 0xf969, 0x6714, 0xf96a,
  /* 0x5f */
  0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d,
  0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e,
  0x85a9, 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518,
  0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf,
  0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38,
  0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d,
  0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4,
  0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7,
  0xf96c, 0x7a61, 0x7d22, 0x8272, 0x7272, 0x751f, 0x7525, 0xf96d,
  0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055,
  0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2,
  0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72,
  /* 0x60 */
  0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd,
  0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790,
  0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b,
  0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e,
  0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c,
  0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a,
  0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae,
  0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b,
  0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2,
  0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x6d89, 0x71ee,
  0xf96e, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f,
  0x665f, 0x7329, 0x73f9, 0x76db, 0x7701, 0x7b6c,
  /* 0x61 */
  0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72,
  0x6d17, 0x7a05, 0x7b39, 0x7d30, 0xf96f, 0x8cb0, 0x53ec, 0x562f,
  0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414,
  0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2,
  0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20,
  0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5,
  0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f,
  0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0,
  0x905c, 0x98e1, 0x7387, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f,
  0x8aa6, 0x9001, 0x980c, 0x5237, 0xf970, 0x7051, 0x788e, 0x9396,
  0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd,
  0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101,
  /* 0x62 */
  0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x6578, 0x6a39, 0x6b8a,
  0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2,
  0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac,
  0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896,
  0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9,
  0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3,
  0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a,
  0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa,
  0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3,
  0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340,
  0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4,
  0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27,
  /* 0x63 */
  0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936,
  0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607,
  0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4,
  0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f,
  0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494,
  0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4,
  0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184,
  0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81,
  0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc,
  0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce,
  0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4,
  0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81,
  /* 0x64 */
  0xf972, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341,
  0xf973, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25,
  0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d,
  0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd,
  0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, 0x6e25, 0x9102, 0x9354,
  0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848,
  0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb,
  0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4,
  0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f,
  0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x57c3, 0x5d16,
  0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384,
  0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d,
  /* 0x65 */
  0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c,
  0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0xf974, 0x91ce, 0x5f31,
  0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, 0x84bb, 0x85e5, 0x8e8d,
  0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, 0x5b43, 0x6059, 0x63da,
  0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, 0x6a23, 0x6d0b, 0x7001,
  0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0xf97b, 0x7f8a, 0xf97c,
  0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, 0xf97e, 0x990a, 0x5704,
  0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a,
  0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830,
  0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c,
  0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88,
  0x4f59, 0xf97f, 0xf980, 0xf981, 0x5982, 0xf982,
  /* 0x66 */
  0xf983, 0x6b5f, 0x6c5d, 0xf984, 0x74b5, 0x7916, 0xf985, 0x8207,
  0x8245, 0x8339, 0x8f3f, 0x8f5d, 0xf986, 0x9918, 0xf987, 0xf988,
  0xf989, 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c,
  0x75ab, 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827,
  0x59f8, 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350,
  0x633b, 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5,
  0x6f14, 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5,
  0xf994, 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f,
  0xf997, 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b,
  0x9cf6, 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1,
  0xf9a0, 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3,
  0xf9a5, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2,
  /* 0x67 */
  0xf9a6, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449,
  0xf9a8, 0xf9a9, 0x584b, 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac,
  0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41,
  0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b,
  0xf9ae, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1,
  0x8a60, 0x8fce, 0xf9b1, 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4,
  0x4e42, 0x502a, 0xf9b5, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca,
  0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0xf9b6, 0x88d4,
  0x8a63, 0x8b7d, 0x8c6b, 0xf9b7, 0x92b3, 0xf9b8, 0x9713, 0x9810,
  0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da,
  0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0xf9b9, 0x61ca,
  0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3,
  /* 0x68 */
  0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07,
  0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f,
  0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515,
  0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9,
  0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b,
  0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9,
  0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0,
  0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a,
  0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0xf9ba, 0xf9bb,
  0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x5be5, 0xf9bc,
  0xf9bd, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0xf9be, 0x66dc,
  0xf9bf, 0x6a48, 0xf9c0, 0x71ff, 0x7464, 0xf9c1,
  /* 0x69 */
  0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0xf9c2, 0x87ef,
  0x8981, 0x8b20, 0x9059, 0xf9c3, 0x9080, 0x9952, 0x617e, 0x6b32,
  0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7,
  0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67,
  0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9,
  0x8e0a, 0x9394, 0x93de, 0xf9c4, 0x4e8e, 0x4f51, 0x5076, 0x512a,
  0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182,
  0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9,
  0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5,
  0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631,
  0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0xf9c5, 0x6a52,
  0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553,
  /* 0x6a */
  0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a,
  0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b,
  0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72,
  0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060,
  0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d,
  0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170,
  0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466,
  0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f,
  0x4e73, 0x4f91, 0x5112, 0x516a, 0xf9c7, 0x552f, 0x55a9, 0x5b7a,
  0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109,
  0x63c4, 0x6538, 0x6709, 0xf9c8, 0x67d4, 0x67da, 0xf9c9, 0x6961,
  0x6962, 0x6cb9, 0x6d27, 0xf9ca, 0x6e38, 0xf9cb,
  /* 0x6b */
  0x6fe1, 0x7336, 0x7337, 0xf9cc, 0x745c, 0x7531, 0xf9cd, 0x7652,
  0xf9ce, 0xf9cf, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb,
  0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9,
  0x936e, 0xf9d0, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2,
  0xf9d3, 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64,
  0x73a7, 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9,
  0xf9da, 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc,
  0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59,
  0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3,
  0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100,
  0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3,
  0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc,
  /* 0x6c */
  0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0xf9dd, 0xf9de, 0x5937,
  0x59e8, 0xf9df, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0xf9e0, 0xf9e1,
  0xf9e2, 0xf9e3, 0x723e, 0x73e5, 0xf9e4, 0x7570, 0x75cd, 0xf9e5,
  0x79fb, 0xf9e6, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0xf9e7,
  0xf9e8, 0x8cbd, 0x8cb3, 0x9087, 0xf9e9, 0xf9ea, 0x98f4, 0x990c,
  0xf9eb, 0xf9ec, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a,
  0x4eba, 0x4ec1, 0x5203, 0x5370, 0xf9ed, 0x54bd, 0x56e0, 0x59fb,
  0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0xf9ee, 0xf9ef, 0x7d6a, 0x8335,
  0xf9f0, 0x8693, 0x8a8d, 0xf9f1, 0x976d, 0x9777, 0xf9f2, 0xf9f3,
  0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0,
  0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0xf9f4, 0xf9f5,
  0x7a14, 0xf9f6, 0x834f, 0x8cc3, 0x5165, 0x5344,
  /* 0x6d */
  0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4,
  0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063,
  0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1,
  0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7,
  0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8,
  0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7,
  0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a,
  0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef,
  0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756,
  0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b,
  0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523,
  0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577,
  /* 0x6e */
  0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d,
  0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09,
  0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e,
  0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17,
  0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7,
  0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8,
  0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575,
  0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e,
  0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea,
  0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178,
  0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb,
  0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1,
  /* 0x6f */
  0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b,
  0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293,
  0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a,
  0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe,
  0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5,
  0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448,
  0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a,
  0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89,
  0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1,
  0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d,
  0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a,
  0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756,
  /* 0x70 */
  0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d,
  0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd,
  0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d,
  0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14,
  0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d,
  0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a,
  0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97,
  0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf,
  0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5,
  0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9,
  0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9,
  0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b,
  /* 0x71 */
  0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7,
  0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4,
  0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d,
  0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7,
  0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db,
  0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152,
  0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8,
  0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c,
  0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301,
  0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41,
  0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7,
  0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea,
  /* 0x72 */
  0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f,
  0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c,
  0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3,
  0x829d, 0x82b7, 0x8718, 0x8a8c, 0xf9fc, 0x8d04, 0x8dbe, 0x9072,
  0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875,
  0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25,
  0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e,
  0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a,
  0x8cd1, 0x8eeb, 0x8fb0, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707,
  0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be,
  0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f,
  0x6715, 0xf9fd, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f,
  /* 0x73 */
  0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f,
  0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a,
  0xf9fe, 0x8e49, 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84,
  0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da,
  0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d,
  0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed,
  0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92,
  0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70,
  0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32,
  0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5,
  0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc,
  0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56,
  /* 0x74 */
  0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0xf9ff, 0x5254,
  0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620,
  0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929,
  0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6,
  0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8,
  0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d,
  0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d,
  0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252,
  0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8,
  0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0xfa00, 0x5243, 0x66ff,
  0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d,
  0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2,
  /* 0x75 */
  0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e,
  0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82,
  0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7,
  0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a,
  0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283,
  0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e,
  0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf,
  0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a,
  0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51,
  0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625,
  0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96,
  0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403,
  /* 0x76 */
  0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0,
  0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074,
  0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4,
  0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4,
  0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4,
  0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed,
  0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x6c88,
  0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31,
  0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253,
  0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c,
  0x5353, 0x5544, 0x577c, 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b,
  0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17,
  /* 0x77 */
  0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058,
  0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d,
  0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0xfa03,
  0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70,
  0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0xfa04,
  0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e,
  0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806,
  0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac,
  0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46,
  0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c,
  0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742,
  0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211,
  /* 0x78 */
  0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557,
  0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d,
  0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247,
  0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a,
  0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2,
  0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305,
  0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b,
  0x62b1, 0x6355, 0xfa06, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de,
  0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea,
  0x98fd, 0x9b91, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, 0xfa07,
  0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2,
  0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43,
  /* 0x79 */
  0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c,
  0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c,
  0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d,
  0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630,
  0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15,
  0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d,
  0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591,
  0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8,
  0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677,
  0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c,
  0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d,
  0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a,
  /* 0x7a */
  0xfa08, 0xfa09, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a,
  0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3,
  0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016,
  0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6,
  0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b,
  0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57,
  0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8,
  0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d,
  0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0xfa0a, 0x8ce2, 0x9249,
  0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354,
  0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2,
  0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b,
  /* 0x7b */
  0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9,
  0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8,
  0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af,
  0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5,
  0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf,
  0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425,
  0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6,
  0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac,
  0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7,
  0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18,
  0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b,
  0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575,
  /* 0x7c */
  0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774,
  0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a,
  0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853,
  0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b,
  0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d,
  0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f,
  0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352,
  0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a,
  0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae,
  0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x8aa8, 0x8cc4,
  0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d,
  0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6,
  /* 0x7d */
  0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e,
  0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd,
  0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb,
  0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431,
  0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147,
  0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667,
  0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8,
  0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07,
  0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5,
  0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09,
  0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9,
  0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70,
};

/*******************************************/
/* P16 code is used as a further code space extension */
/* for 16-bit character sets. Spec P17 */
/*******************************************/
static void _DtvCC_P16Cmd(HI_U8 *pu8Cmd)
{
    HI_U16 u16Unicode;
    HI_U8 u8Char1,u8Char2;

    u16Unicode = ( pu8Cmd[1] << 8) | pu8Cmd[2];
    DEC_TRACE("P16 two byte codes:%#x\n",u16Unicode);

    /*todu...*/
    /*here we should map the 16_bit code to unicode data*/
    /*We treat the language as EUC-KR(ksc5601)*/
    if(pu8Cmd[1] >= 0xa1)
    {
        u8Char1 = pu8Cmd[1]-0x80;
        u8Char2 = pu8Cmd[2]-0x80;
        if((u8Char1 >= 0x21 && u8Char1 <= 0x2c)
            || (u8Char1 >= 0x30 && u8Char1 <= 0x48)
            || (u8Char1 >= 0x4a && u8Char1 <= 0x7d))
        {
            if (u8Char2 >= 0x21 && u8Char2 < 0x7f)
            {
                HI_S32 i = 94 * (u8Char1 - 0x21) + (u8Char2 - 0x21);
                if (i < 1410)
                {
                    if (i < 1115)
                    {
                        u16Unicode = ksc5601_2uni_page21[i];
                    }
                }
                else if (i < 3854)
                {
                    if (i < 3760)
                    {
                        u16Unicode = ksc5601_2uni_page30[i-1410];
                    }
                }
                else
                {
                    if (i < 8742)
                    {
                        u16Unicode = ksc5601_2uni_page4a[i-3854];
                    }
                }
            }
        }
    }
    else if (pu8Cmd[1] == 0)
    {
        /* ASCII */
    }
    else
    {
        HI_ERR_CC("p16 code data : %#x not support\n",pu8Cmd[1]);
    }
    DEC_TRACE("--->%#x\n",u16Unicode);
    if(0xfffd != u16Unicode)
    {
        stCaptionBuf.u16Buf[stCaptionBuf.u8BufLen++] = u16Unicode;
    }
    return;

}

static void _DtvCC_SetCurrentWindowCmd(HI_U8 *pu8Cmd)
{
    HI_U8 windowID;
    if(NULL == pu8Cmd)
    {
        HI_ERR_CC("CMD is null!\n");
        return ;
    }

    windowID = GET3(pu8Cmd,0,0);
    DEC_TRACE("Set Current Window command  %#x\n",*pu8Cmd);
    DEC_TRACE("windowID:%d\n",windowID);

    CC708_OSD_SetCurrentWindow(windowID);
    return ;
}

static void _DtvCC_ClearWindowsCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8WindowMap;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowMap = GET8(pu8Cmd,1);
    DEC_TRACE("Clear Window command %#x\n",*pu8Cmd);
    DEC_TRACE("u8WindowMap:0x%x\n",u8WindowMap);

    // execuate command
    CC708_OSD_ClearWindows(u8WindowMap);
    return ;
}

static void _DtvCC_DisplayWindowsCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8WindowMap;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowMap = GET8(pu8Cmd,1);
    DEC_TRACE("Display Window command %#x\n",*pu8Cmd);
    DEC_TRACE("u8WindowMap:0x%x\n",u8WindowMap);

    // execuate command
    CC708_OSD_DisplayWindows(u8WindowMap);
    return ;
}

static void _DtvCC_HideWindowsCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8WindowMap;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowMap = GET8(pu8Cmd,1);
    DEC_TRACE("Hide Window command  %#x\n",*pu8Cmd);
    DEC_TRACE("u8WindowMap:0x%x\n",u8WindowMap);

    // execuate command
    CC708_OSD_HideWindows(u8WindowMap);
    return ;
}

static void _DtvCC_ToggleWindowsCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8WindowMap;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowMap = GET8(pu8Cmd,1);
    DEC_TRACE("Toggle Window command  %#x\n",*pu8Cmd);
    DEC_TRACE("u8WindowMap:0x%x\n",u8WindowMap);

    // execuate command
    CC708_OSD_ToggleWindows(u8WindowMap);
    return ;
}

static void _DtvCC_DeleteWindowsCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8WindowMap;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowMap = GET8(pu8Cmd,1);

    DEC_TRACE("Delete Window command  %#x,u8WindowMap:0x%x\n",*pu8Cmd,u8WindowMap);

    // execuate command
    CC708_OSD_DeleteWindows(u8WindowMap);
    return ;
}

static void _DtvCC_DelayCmd(HI_U8 *pu8Cmd)
{
    HI_U8 tenthOfSecond;
    CC708_OBJECT_S *pstCCObj= CC708_OBJ_GetHandle(0);

    if(NULL == pu8Cmd)
    {
        return ;
    }

    tenthOfSecond = GET8(pu8Cmd,1);
    DEC_TRACE("Delay command  %#x\n",*pu8Cmd);

    pstCCObj->u8IsDelay = 1;
    _DtvCC_DelayTimerStart(0,tenthOfSecond);

    return ;
}

static void _DtvCC_ResetCmd(HI_U8 *pu8Cmd)
{
    /*here we do nothing,because reset command has been processed before input it to Service Queue*/
    DEC_TRACE("CC708Reset command  %#x\n",*pu8Cmd);

    /* clear input buffer */
    CC708_OSD_Reset();
}

static void _DtvCC_SetPenAttributesCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8PenSize,u8FontName,u8TextTag,u8TextOffset,u8IsItalics,u8IsUnderline,u8EdgeType;
    HI_U8 u8Offset = 1;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    /*we map all the attribute to unf attribute*/
    u8PenSize = GET2(pu8Cmd,u8Offset,0) + HI_UNF_CC_FONTSIZE_SMALL;
    CC708DECPARAM_UPPER_CHECK(u8PenSize,HI_UNF_CC_FONTSIZE_BUTT,"Pen Size",HI_UNF_CC_FONTSIZE_STANDARD);

    u8TextOffset = GET2(pu8Cmd,u8Offset,2) + CC_OS_SUBSCRIPT;
    CC708DECPARAM_UPPER_CHECK(u8TextOffset,MAX_CC_OFFSET,"u8Offset",CC_OS_NORMAL);

    u8TextTag = GET4(pu8Cmd,u8Offset,4);
    u8Offset++;

    u8FontName = GET3(pu8Cmd,u8Offset,0) + HI_UNF_CC_FN_DEFAULT;
    u8EdgeType = GET3(pu8Cmd,u8Offset,3) + HI_UNF_CC_EDGETYPE_NONE;
    CC708DECPARAM_UPPER_CHECK(u8EdgeType,HI_UNF_CC_EDGETYPE_BUTT,"Edge Type",HI_UNF_CC_EDGETYPE_NONE);
    u8IsUnderline = GET1(pu8Cmd,u8Offset,6);
    u8IsItalics = GET1(pu8Cmd,u8Offset,7);

    DEC_TRACE("Set Pen Attribute command  %#x\n",*pu8Cmd);
    DEC_TRACE("u8PenSize:%d,u8FontName:%d,u8TextTag:%d,u8TextOffset:%d,u8IsItalics:%d,u8IsUnderline:%d,u8EdgeType;%d\n",
                  u8PenSize,u8FontName,u8TextTag,u8TextOffset,u8IsItalics,u8IsUnderline,u8EdgeType);

    CC708_OSD_SetPenAttributes (u8PenSize,u8FontName,u8TextTag,u8TextOffset,u8IsItalics,u8IsUnderline,u8EdgeType);
}

static void _DtvCC_SetPenColorCmd(HI_U8 *pu8Cmd)
{
    HI_U8 u8FGColor,u8FGOpacity,u8BGColor,u8BGOpacity,u8EdgeColor;
    HI_U32 u32FGColor,u32BGColor,u32EdgeColor;
    HI_U8 u8Offset = 1;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8FGColor = GET6(pu8Cmd,u8Offset,0);
    u32FGColor = _DtvCC_Translate2Color(u8FGColor);// get r,g,b value
    u8FGOpacity = GET2(pu8Cmd,u8Offset,6) + HI_UNF_CC_OPACITY_SOLID;//according with hi_unf_cc.h/HI_UNF_CC_OPACITY_E
    u8Offset++;

    u8BGColor = GET6(pu8Cmd,u8Offset,0);
    u32BGColor = _DtvCC_Translate2Color(u8BGColor);// get r,g,b value
    u8BGOpacity = GET2(pu8Cmd,u8Offset,6) + HI_UNF_CC_OPACITY_SOLID;
    u8Offset++;

    u8EdgeColor = GET6(pu8Cmd,u8Offset,0);
    u32EdgeColor = _DtvCC_Translate2Color(u8EdgeColor);// get r,g,b value

    DEC_TRACE("Set Pen Color command  %#x\n",*pu8Cmd);
    DEC_TRACE("u8FGColor:%d,u8BGColor:%d,u8EdgeColor:%d\n",u8FGColor,u8BGColor,u8EdgeColor);
    DEC_TRACE("u32FGColor:0x%x,u32BGColor:0x%x,u32EdgeColor:0x%x\n",u32FGColor,u32BGColor,u32EdgeColor);
    DEC_TRACE("u8FGOpacity:%d,u8BGOpacity:%d\n",u8FGOpacity,u8BGOpacity);

    CC708_OSD_SetPenColor (u32FGColor,u8FGOpacity,u32BGColor,u8BGOpacity,u32EdgeColor);
}

static void _DtvCC_SetPenLocationCmd(HI_U8 *pu8Cmd)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);
    HI_U8 u8Row,u8Column,u8Offset = 1;

    if(NULL == pu8Cmd || NULL == pstCCObj)
    {
        return ;
    }

    u8Row = GET4(pu8Cmd,u8Offset,0);
    CC708DECPARAM_UPPER_CHECK(u8Row,MAX_CC_ROWS,"Pen Location u8Row",MAX_CC_ROWS-1);
    u8Offset++;
    u8Column = GET6(pu8Cmd,u8Offset,0);
    CC708DECPARAM_UPPER_CHECK(u8Column,pstCCObj->stScreen.u16MaxColumnNum,"Pen Location u8Column",pstCCObj->stScreen.u16MaxColumnNum-1);

    DEC_TRACE("Set Pen Location command %#x\n",*pu8Cmd);
    DEC_TRACE("u8Row:%d,u8Column:%d\n\n",u8Row,u8Column);

    CC708_OSD_SetPenLocation (u8Row,u8Column);
}

static void _DtvCC_SetWindowAttributesCmd(HI_U8 *pu8Cmd)
{

    HI_U8 u8Justify,u8PrintDirection,u8ScrollDirection,u8Temp;
    HI_U8 u8WordWrap,u8DisplayEffect,u8EffectDirection,u8EffectSpeed;
    HI_U8 u8FillColor,u8FillOpacity,u8BorderType,u8BorderColor,u8Offset = 1;
    HI_U32 u32FillColor,u32BorderColor;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8FillColor = GET6(pu8Cmd,u8Offset,0);
    u32FillColor = _DtvCC_Translate2Color(u8FillColor);// get r,g,b value

    u8FillOpacity = GET2(pu8Cmd,u8Offset,6);
    u8FillOpacity += HI_UNF_CC_OPACITY_SOLID;/*here we map the opacity in ts stream to unf opacity*/
    u8Offset++;

    u8BorderColor = GET6(pu8Cmd,u8Offset,0);
    u32BorderColor = _DtvCC_Translate2Color(u8BorderColor);// get r,g,b value
    u8BorderType = GET2(pu8Cmd,u8Offset,6);
    u8Offset++;

    u8Justify = GET2(pu8Cmd,u8Offset,0);
    u8Justify += HI_UNF_CC_JUSTIFY_LEFT;

    u8ScrollDirection = GET2(pu8Cmd,u8Offset,2);
    u8ScrollDirection += CC_SD_LEFT_RIGHT;

    u8PrintDirection = GET2(pu8Cmd,u8Offset,4);
    u8PrintDirection += CC_PD_LEFT_RIGHT;

    u8WordWrap = GET1(pu8Cmd,u8Offset,6);
    u8WordWrap += HI_UNF_CC_WW_DISABLE;

    u8Temp = GET1(pu8Cmd,u8Offset,7);
    u8BorderType = (u8Temp << 2) | u8BorderType;
    u8BorderType += HI_UNF_CC_EDGETYPE_NONE;
    u8Offset++;

    u8DisplayEffect = GET2(pu8Cmd,u8Offset,0) + CC_EFFECT_SNAP;
    CC708DECPARAM_UPPER_CHECK(u8DisplayEffect,MAX_CC_EFFECT,"Display Effect",CC_EFFECT_SNAP);

    u8EffectDirection = GET2(pu8Cmd,u8Offset,2) + CC_DED_LEFT_RIGHT;
    u8EffectSpeed = GET4(pu8Cmd,u8Offset,4);

    DEC_TRACE("Set Window Attribute command  %#x\n",*pu8Cmd);
    DEC_TRACE("u8Justify:%d,u8PrintDirection:%d,u8ScrollDirection:%d,u8WordWrap:%d,u8DisplayEffect:%d\n",
                  u8Justify,u8PrintDirection,u8ScrollDirection,u8WordWrap,u8DisplayEffect);
    DEC_TRACE("u8EffectDirection:%d,u8EffectSpeed:%d,u8FillOpacity:%d,u8BorderType:%d\n",
                  u8EffectDirection,u8EffectSpeed,u8FillOpacity,u8BorderType);

    CC708_OSD_SetWindowAttributes (u8Justify,u8PrintDirection,u8ScrollDirection,u8WordWrap,
                         u8DisplayEffect,u8EffectDirection,u8EffectSpeed,u32FillColor,
                         u8FillOpacity,u8BorderType,u32BorderColor);
}

static void _DtvCC_DefineWindowCmd(HI_U8 *pu8Cmd)
{
    CC708_OBJECT_S *pstCCObj = CC708_OBJ_GetHandle(0);

    HI_U8 u8WindowID,u8Priority,u8AnchorPoint,u8RelativePositioning,u8AnchorVertical;
    HI_U8 u8AnchorHorizontal,u8RowCount,u8ColumnCount,u8RowLock,u8ColumnLock;
    HI_U8 u8IsVisible,u8WindowStyleID,u8PenStyleID;
    HI_U8 u8Offset = 0;

    if(NULL == pu8Cmd)
    {
        return ;
    }

    u8WindowID = GET3(pu8Cmd,u8Offset,0);
    u8Offset++;

    u8Priority = GET3(pu8Cmd,u8Offset,0);
    u8ColumnLock = GET1(pu8Cmd,u8Offset,3);
    u8RowLock = GET1(pu8Cmd,u8Offset,4);
    u8IsVisible = GET1(pu8Cmd,u8Offset,5);
    u8Offset++;

    u8AnchorVertical = GET7(pu8Cmd,u8Offset,0);
    u8RelativePositioning = GET1(pu8Cmd,u8Offset,7);
    if( u8RelativePositioning == 0 )
    {
        CC708DECPARAM_UPPER_CHECK(u8AnchorVertical,MAX_CC_ABSOLUTE_ANCHOR_VERT,"Anchor Vertical",MAX_CC_ABSOLUTE_ANCHOR_VERT-1);
    }
    else
    {
        CC708DECPARAM_UPPER_CHECK(u8AnchorVertical,MAX_CC_RELATIVE_ANCHOR,"Anchor Vertical",MAX_CC_RELATIVE_ANCHOR-1);
    }
    u8Offset++;

    u8AnchorHorizontal = GET8(pu8Cmd,u8Offset);
    if( u8RelativePositioning == 0 )
    {
        CC708DECPARAM_UPPER_CHECK(u8AnchorHorizontal,pstCCObj->stScreen.u16MaxHorizonalCells,"Anchor Horizontal",pstCCObj->stScreen.u16MaxHorizonalCells-1);
    }
    else
    {
        CC708DECPARAM_UPPER_CHECK(u8AnchorHorizontal,MAX_CC_RELATIVE_ANCHOR,"Anchor Horizontal",MAX_CC_RELATIVE_ANCHOR-1);
    }

    u8Offset++;

    u8RowCount = GET4(pu8Cmd,u8Offset,0);
    CC708DECPARAM_UPPER_CHECK(u8RowCount,MAX_CC_ROWS,"row count",MAX_CC_ROWS-1);
    u8AnchorPoint = GET4(pu8Cmd,u8Offset,4);
    CC708DECPARAM_UPPER_CHECK(u8AnchorPoint,MAX_CC_AP,"anchor point",MAX_CC_AP-1);
    u8Offset++;

    u8ColumnCount = GET6(pu8Cmd,u8Offset,0);
    CC708DECPARAM_UPPER_CHECK(u8ColumnCount,MAX_CC_COLUMNS_16B9,"Pen Location column",MAX_CC_COLUMNS_16B9-1);
    u8Offset++;

    u8PenStyleID = GET3(pu8Cmd,u8Offset,0);
    CC708DECPARAM_UPPER_CHECK(u8PenStyleID,MAX_CC_PEN_STYLE,"pen Style ID",MAX_CC_PEN_STYLE-1);
    u8WindowStyleID = GET3(pu8Cmd,u8Offset,3);
    CC708DECPARAM_UPPER_CHECK(u8WindowStyleID,MAX_CC_WINDOW_STYLE,"window Style ID",MAX_CC_WINDOW_STYLE-1);

    DEC_TRACE("===============Get CC708DefineWindow command  %#x=======================\n",*pu8Cmd);
    DEC_TRACE("u8WindowID:%d;u8Priority:%d;u8AnchorPoint:%d;u8RelativePositioning:%d,u8AnchorVertical:%d\n",
                  u8WindowID,u8Priority,u8AnchorPoint,u8RelativePositioning,u8AnchorVertical);
    DEC_TRACE("u8AnchorHorizontal:%d;u8RowCount:%d;u8ColumnCount:%d;u8RowLock:%d;u8ColumnLock:%d\n",
                  u8AnchorHorizontal,u8RowCount,u8ColumnCount,u8RowLock,u8ColumnLock);
    DEC_TRACE("u8IsVisible:%d;u8WindowStyleID:%d;u8PenStyleID:%d\n",u8IsVisible,u8WindowStyleID,u8PenStyleID);
    DEC_TRACE("===============================================================================\n");

    CC708_OSD_DefineWindow (u8WindowID,u8Priority,u8AnchorPoint,u8RelativePositioning,u8AnchorVertical,
                  u8AnchorHorizontal,u8RowCount,u8ColumnCount,u8RowLock,u8ColumnLock,u8IsVisible,
                  u8WindowStyleID, u8PenStyleID);
}

static HI_BOOL _DtvCC_OddParityCheck(HI_U8 data)
{
    HI_S32 i = 0;
    HI_U8 cnt=0;

    for (i = 7; i >= 0; i--)
    {
        if (data & 1<<i)
        {
            cnt++;
        }
    }
    if ( (cnt % 2) == 0 )  //find even num of 1 in data bus
    {
        return HI_FALSE;   //faied the odd parity check
    }

    return HI_TRUE; //odd parity check ok.
}


/*****************************************************************************
*                       End Of File
*****************************************************************************/

